Tools/R (55)

Tools/R

R - dictionary 만들기

2023. 3. 15. 18:59
반응형

List 를 이용한 방법

# dictionary 생성
dict <- list(name = "John", age = 30, city = "New York")

# dictionary 사용
dict$name
# [1] "John"

dict$age
# [1] 30

dict$city
# [1] "New York"

 

vector 를 활용한 방법

ㄴ setNames 함수를 활용

# dictionary 생성
dict <- setNames(c("John", 30, "New York"), c("name", "age", "city"))

# dictionary 사용
dict$name
# [1] "John"

dict$age
# [1] 30

dict$city
# [1] "New York"

 

hash 함수를 활용한 방법

library(hash)
h <- hash() 
h[['a']] <- 'a'
h[['b']] <- 'b'
h[['c']] <- 'c'
h[['d']] <- 'd'

h[['a']]

 

반응형

'Tools > R' 카테고리의 다른 글

R - 변수 bucketing (카테고리화)  (0) 2023.03.10
R - lag 변수 만들기  (0) 2023.03.10
R - 반복문 대신 사용하는 lapply 패턴  (0) 2023.03.10
R - na to zero  (0) 2023.03.09
R - 컬럼별 동일한 함수 적용을 위한 lapply 테크닉  (0) 2022.09.05
반응형

R 에서 특정 변수를 카테고리화 하고 싶을 때가 많다. 

 

다양한 방법이 있지만, 

아래 cut 함수를 사용하는 코드로 0~5, 6~10, 11~15, ... >100 으로 카테고리화가 가능하다. 

cat <- seq(0,100,5)
df$cat <- cut(df$x, breaks = c(cat, Inf), labels = cat)
df$cat <- factor(df$cat, levels=cat)

-> breaks 의 element 보다 labels 의 elements 의 갯수가 1개 적다. 

 

좀 더 일반적으로는 다음과 같다.

# 예시 데이터 생성
set.seed(123)
data <- data.frame(id = 1:10, value = rnorm(10, mean = 50, sd = 10))

# 카테고리화
data$cat <- cut(data$value, breaks = c(0, 25, 50, 75, 100), labels = c("low", "medium-low", "medium-high", "high"))

 

반응형

'Tools > R' 카테고리의 다른 글

R - dictionary 만들기  (0) 2023.03.15
R - lag 변수 만들기  (0) 2023.03.10
R - 반복문 대신 사용하는 lapply 패턴  (0) 2023.03.10
R - na to zero  (0) 2023.03.09
R - 컬럼별 동일한 함수 적용을 위한 lapply 테크닉  (0) 2022.09.05

Tools/R

R - lag 변수 만들기

2023. 3. 10. 04:03
반응형

Hmisc 의 Lag 변수를 통해 timeseries 데이터의 lag 변수를 만들 수 있다. 

만약, 그룹별 Lag 변수를 만들고 싶으면 dplyr group_by 를 통해 만들 수 있다. 

library(Hmisc)
data <- data %>% group_by(gender, age) %>% mutate(lag = Lag(variable, 1))
반응형

'Tools > R' 카테고리의 다른 글

R - dictionary 만들기  (0) 2023.03.15
R - 변수 bucketing (카테고리화)  (0) 2023.03.10
R - 반복문 대신 사용하는 lapply 패턴  (0) 2023.03.10
R - na to zero  (0) 2023.03.09
R - 컬럼별 동일한 함수 적용을 위한 lapply 테크닉  (0) 2022.09.05
반응형

반복문을 돌면서 여러개의 dataframe 을 만들고, 

이것들을 합쳐서 최종적인 결과 dataframe 을 만드는 경우 아래와 같이 함

 

brand_names <- c("BBQ", "BHC")
tmp_dfs <- lapply(brand_names, function(x){
  p <- paste0(x, "_payment")
  b <- paste0(x, "_buzz")
  tmp_df[1, 'brand'] <- x
  tmp_df[1, 'cor'] <- cor.test(merged[,p], merged[,b])$estimate
  tmp_df
})

df_result <- bind_rows(tmp_dfs)
df_result

출력
> df_result
        cor brand
1 0.6971354   BBQ
2 0.4675438   BHC

반응형

'Tools > R' 카테고리의 다른 글

R - 변수 bucketing (카테고리화)  (0) 2023.03.10
R - lag 변수 만들기  (0) 2023.03.10
R - na to zero  (0) 2023.03.09
R - 컬럼별 동일한 함수 적용을 위한 lapply 테크닉  (0) 2022.09.05
R - aggregate / separate_rows  (0) 2022.06.21

Tools/R

R - na to zero

2023. 3. 9. 22:39
반응형

 

모든 na값을 0로 바꾸기

df[is.na(df)] <- 0

 

특정 컬럼의 na 값을 0으로 바꾸기

df[is.na(df$col_name), 'col_name'] <- 0

 

여러 컬럼의 na 값을 0으로 바꾸기

impute_var <- c('a','b','c')
df[impute_var][is.na(df[impute_var])] <- 0

 

반응형
반응형

R - 컬럼별 동일한 함수 적용을 위한 lapply 테크닉

/* DeepPlay 2022-09-05 */

이전 포스트: apply 계열의 R 함수 정리 (포스팅)

 

데이터 처리 중, 각 컬럼별로 동일한 함수를 적용시키고 싶을 때가 있다. 예를 들면, string 형태로 저장된 컬럼들을 일괄적으로 numeric으로 바꾸고 싶다고 하자. 이 때, lapply 를 유용하게 사용할 수 있다. 

 

정보) lapply 는 vector, list 를 인풋으로 받아 list 를 아웃풋으로 내보낸다.   

 

아래 함수는 vars 에 지정된 컬럼들을 lapply 함수를 활용해 일괄적으로  numeric 형으로 변환하는 코드이다.  

# vars 에 numeric 으로 변환하고 싶은 컬럼 
data[,vars] <- lapply(vars, function(x){
  as.numeric(unlist(data[,x])) # [,x] 방식의 컬럼 선택은 output 을 list 형태로 반환한다. 
})

위 코드를 설명하면 우선 각 컬럼 x 별로 as.numeric 함수를 적용시켜 이 값을 list of vectors 로 반환한다. 그리고 이 반환값이 dataframe 의 컬럼값을 지정하도록 수행된다. (이러한 코드가 가능한 이유는 dataframe 이 기본적으로 list 의 결합이기 때문이다.)

반응형
반응형

 

R - aggregate / separate_rows

 

데이터 처리 도중, 특정 key 를 기준으로, 문자를 리스트형태로 바꾸고 싶을 때가 있다. 

이 때, R 에서 사용할 수 있는 함수가 aggregate 와 separate_rows 이다. 

(hive 에서는 collect_set 과 explode 함수가 비슷한 기능을 함)

 

왼쪽 테이블 -> 오른쪽 테이블로: separate_rows

오른쪽 테이블 -> 왼쪽 테이블로: aggregate

library(tidyverse)
df <- data.frame(Family_ID = 1:2,
  name = c("Smith, John", "Walker, Mike"),
  stringsAsFactors = FALSE)
  
df2 <- df %>% separate_rows(name)
df2
#   Family_ID name  
#      1 Smith 
#      1 John  
#      2 Walker
#      2 Mike  

df3 <- aggregate(name ~ Family_ID, df2, toString)
df3
#  Family_ID name
#      1  Smith, John
#      2 Walker, Mike
반응형
반응형

R - 난수 생성을 일별로 변경하기

 

R 에서 난수를 생성 또는 랜덤 샘플링 작업의 결과가 일별로 바뀌도록 하고 싶을 때가 있다. 

방법은 간단하게 일별로 random seed 를 동일하게 맞춰주면 된다. 

특정 날짜 '01/06/2022' 를 integer 형으로 변환하면 일별로 동일한 숫자가 나오도록 구현할 수 있다. 

 

library(tidyverse)
dayYear <- as.Date(Sys.Date(),format='%d/%m/%Y') %>% lubridate::yday() %>% as.integer()
set.seed(dayYear)

sample(nrow(10)) # 같은 날에는 동일한 순서의 숫자 10개가 나온다.

 

주의할점은 값이 정수를 갖도록 as.integer 함수를 통해 변환해주어야한다.

(만약 double 인 경우, 실제 시드는 매번 달라진다. 이는 컴퓨터가 double 형을 메모리에 저장하는 방식 때문일듯하다.)

반응형
반응형

theme_bw(base_size = 12, base_family = "Kakao Regular") 또는

par("Kakao Regular") 를 적용해도 한글이 나오지 않는 이슈가 발생

library(showtext)
showtext_auto()

위 블록을 통해 해결할 수 있었음

반응형
반응형


R 에서 한글 파일 쉽게 읽어오는 팁


운영체제 별로 다른 파일 인코딩으로 저장되는 문제로 인해, R 에서 한글이 인코딩 된 파일을 읽어올 때 문제가 자주 생깁니다. 아예 읽어오지 못하는 경우도 있고, 읽어와도 프린트 했을 때, 한글이 깨져 있는 경우가 많은데요. 특히 EUC-KR 로 인코딩 된 파일의 경우, data.table의 fread 나 readr의 read_csv 를 이용하기가 힘듭니다. 


이런 상황에서 readAny 패키지의 read.any 함수를 이용하면 delimeter 로 구분된 text 파일이나, csv 파일 등을 쉽게 읽어올 수 있습니다 (또는 패키지 설치를 하지 않고 함수를 변수로 저장한 다음 사용하셔도 됩니다). 출처는 이곳입니다. readr 패키지의 guess_encoding 함수를 이용해 파일 인코딩을 알아낸 후, 이 정보를 이용해 read.table 로 읽어오는 방식입니다. 그리고 확장자에 맞게 delimter 를 지정하는 로직까지 있습니다. 

library(devtools)

install_github("plgrmr/readAny", force = TRUE)
library(readAny)

read.any("http://philogrammer.com/melon10_euc.csv", header = TRUE)

library(readr) read.any <- function(text, sep = "", ...) { encoding <- as.character(guess_encoding(text)[1,1]) setting <- as.character(tools::file_ext(text)) if(sep != "" | !(setting %in% c("csv", "txt")) ) setting <- "custom" separate <- list(csv = ",", txt = "\n", custom = sep) result <- read.table(text, sep = separate[[setting]], fileEncoding = encoding, ...) return(result) }

philogrammer 님의 방법에 추가적으로, 한 함수를 통해 엑셀 파일까지 읽어오기 위해 아래와 같이 변형해서 사용하였습니다. 

read_any <- function(text, sep = "", ...) {
  encoding <- as.character(guess_encoding(text)[1,1])
  setting <- as.character(tools::file_ext(text))
  
  if(setting == 'xlsx'){
      result <- read_excel(text)
  }
  else {
      if(sep != "" | !(setting  %in% c("csv", "txt")) ) setting <- "custom"
      separate <- list(csv = ",", txt = "\n", custom = sep)
      result <- read.table(text, sep = separate[[setting]], fileEncoding = encoding, ...)
  }
  return(result)
}

참고자료

http://philogrammer.com/2017-03-15/encoding/

반응형
반응형