반응형
dplyr::filter에서 문자열을 변수 이름으로 전달
저는 제 질문을 설명하기 위해 mtcars 데이터 세트를 사용하고 있습니다.
예를 들어, 데이터를 4-cyl 자동차에 부분 집합화하려고 합니다.할 수 있습니다.
mtcars %>% filter(cyl == 4)
제 작업에서는 열 이름으로 문자열 변수를 전달해야 합니다.예:
var <- 'cyl'
mtcars %>% filter(var == 4)
저도 그랬어요.
mtcars %>% filter(!!var == 4)
두 경우 모두 데이터 프레임이 비어 있습니다.
!!
또는UQ
변수를 평가합니다.mtcars %>% filter(!!var == 4)
와 동일합니다.mtcars %>% filter('cyl' == 4)
여기서 조건은 항상 거짓으로 평가됩니다. 인쇄를 통해 이를 증명할 수 있습니다.!!var
필터 기능:
mtcars %>% filter({ print(!!var); (!!var) == 4 })
# [1] "cyl"
# [1] mpg cyl disp hp drat wt qsec vs am gear carb
# <0 rows> (or 0-length row.names)
평가하기var
에게cyl
열, 변환해야 합니다.var
을 상징하는.cyl
먼저, 그리고 나서 기호를 평가합니다.cyl
열로:
사용.rlang
:
library(rlang)
var <- 'cyl'
mtcars %>% filter((!!sym(var)) == 4)
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#2 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#3 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
# ...
또는 사용as.symbol/as.name
기준 R:
mtcars %>% filter((!!as.symbol(var)) == 4)
mtcars %>% filter((!!as.name(var)) == 4)
@snoram의 대답은 우아하고 전적으로 의존적이라고 생각합니다.dplyr
.
var <- c('cyl')
mtcars %>% filter(get(var) == 4)
목록과 함께 사용할 수도 있습니다.간단한 예를 들어 필터링된 각 열의 개수를 새 데이터 집합으로 가져올 수 있습니다.
#adding car name
mtcars <- rownames_to_column(mtcars, "car_name")
#name your vectors
vector <- c("vs","am","carb")
df2 <- data.frame()
for (variable in vector) {
df1 <- mtcars %>% filter(get(variable) == 1) %>% summarise(variable = n_distinct(car_name)) %>% data.frame()
df2<- rbind(df2,df1)
}
이제 사용할 것을 권장합니다..data
대명사:
library(dplyr)
mtcars %>% filter(.data[[var]] == 4)
# mpg cyl disp hp drat wt qsec vs am gear carb
#Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
#Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
#Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
#Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
#Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
#Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
#Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
eval(문자열)을 사용하여 문자열을 변수로 평가할 수 있습니다.
mtcars %>% filter(eval(parse(text='cyl')) == 4)
언급URL : https://stackoverflow.com/questions/48219732/pass-a-string-as-variable-name-in-dplyrfilter
반응형
'programing' 카테고리의 다른 글
Git에서 파일이 삭제된 시간 찾기 (0) | 2023.06.15 |
---|---|
데이터 프레임을 사전으로 변환하는 방법 (0) | 2023.06.15 |
포인터(주소)가 음수가 될 수 있습니까? (0) | 2023.06.15 |
Ruby에서 해시의 모든 값 변경 (0) | 2023.06.15 |
Wordpress 블록 테마에 사용자 지정 블록 추가(플러그인을 사용하지 않음) (0) | 2023.06.15 |