我正在尝试根据DataFrame中的另一列替换两列的值。我想使用dplyr。 DataFrame的示例是:
df <- data.frame(col1 = c('a', 'b', 'a', 'c', 'b', 'c'),
col2 = c(2, 4, 6, 8, 10, 12),
col3 = c(5, 10, 15, 20, 25, 30))
df
如果col1 ='b',我想将col2和col3乘以10,如果col1 ='c',我要将col2和col 3乘以20。
所需的输出应如下:
col1 col2 col3
1 a 2 5
2 b 40 100
3 a 6 15
4 c 160 400
5 b 100 250
6 c 240 600
我尝试过:
df %>% filter(., col1=='b') %>% mutate(.= replace(., col2, col2*10)) %>% mutate(.= replace(., col3, col3*10))
df %>% filter(., col1=='c') %>% mutate(.= replace(., col2, col2*20)) %>% mutate(.= replace(., col3, col3*20))
输出为:
Error in replace(., col2, col2*10): object 'col2' not found
我也尝试过:
df %>% mutate_at(vars(col2, col3), funs(ifelse(col1=='b', col2*10, col3*10))
df %>% mutate_at(vars(col2, col3), funs(ifelse(col1=='c', col2*20, col3*20))
我再次遇到错误:
funs() is soft deprecated as of dplyr 0.8.0 ...
有人可以帮忙吗? 谢谢:)
答案 0 :(得分:1)
我们可以直接将filter
与mutate_at
结合使用,而不必case_when
然后加入
library(dplyr)
df %>%
mutate_at(vars(col2, col3), ~
case_when(col1 == 'b' ~ .* 10, col1 == 'c' ~ .* 20, TRUE ~ .))
# col1 col2 col3
#1 a 2 5
#2 b 40 100
#3 a 6 15
#4 c 160 400
#5 b 100 250
#6 c 240 600
或者在dplyr
1.0.0中,可以使用mutate/across
df %>%
mutate(across(c(col2, col3), ~
case_when(col1 == 'b' ~ .* 10, col1 == 'c' ~ .* 20, TRUE ~ .)))
# col1 col2 col3
#1 a 2 5
#2 b 40 100
#3 a 6 15
#4 c 160 400
#5 b 100 250
#6 c 240 600