나는 여기에 비슷한 질문이 몇 개 있다는 것을 알고 있지만, 내가 가지고있는 정확한 문제를 다루는 것은 없습니다.
set.seed(4)
df = data.frame(
Key = c("A", "B", "A", "D", "A"),
Val1 = rnorm(5),
Val2 = runif(5),
Val3 = 1:5
)
Key == "A"인 행의 값 열 값을 0으로 만들고 싶습니다. 열 이름은 다음을 통해 참조됩니다 grep
.
cols = grep("Val", names(df), value = TRUE)
일반적 으로이 경우 원하는 것을 달성하려면 다음 data.table
과 같이 사용 하십시오.
library(data.table)
df = as.data.table(df)
df[Key == "A", (cols) := 0]
원하는 출력은 다음과 같습니다.
Key Val1 Val2 Val3
1 A 0.000000 0.00000000 0
2 B -1.383814 0.55925762 2
3 A 0.000000 0.00000000 0
4 D 1.437151 0.05632773 4
5 A 0.000000 0.00000000 0
그러나 이번에 dplyr
는 모든 사람이 사용하는 팀 프로젝트를 진행 하면서 사용해야 합니다. 방금 제공 한 데이터는 예시이며 실제 데이터는 업데이트 할 16 개의 값 열이있는> 5m 행입니다. 내가 생각 해낼 수있는 유일한 해결책은 다음 mutate_at
과 같이 사용하는 것입니다.
df %>% mutate_at(.vars = vars(cols), .funs = function(x) ifelse(df$Key == "A", 0, x))
그러나 이것은 실제 데이터에서 매우 느린 것 같습니다 . 더 우아하고 더 중요한 솔루션을 찾고자했습니다.
나는 map
, unquoting using !!
, using get
and :=
( :=
in data.table에 의해 가려 질 수 있음) 등을 사용하여 많은 조합을 시도했지만 이러한 작업이 유효한 솔루션을 구성하기에 충분히 깊지 않은 방법에 대한 나의 이해가 있다고 생각합니다.