【发布时间】:2017-09-10 09:25:08
【问题描述】:
我想用 dplyr 通过使用变量传递列名来动态地改变数据框的一列。例如,我有以下数据框:
DF <- data.frame(A = 1:10,
B = 11:20,
C = c(23:30, 21:22),
D = c(39:40, 31:38),
E = c(TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE))
DF
A B C D E
1 1 11 23 39 TRUE
2 2 12 24 40 TRUE
3 3 13 25 31 TRUE
4 4 14 26 32 TRUE
5 5 15 27 33 TRUE
6 6 16 28 34 TRUE
7 7 17 29 35 TRUE
8 8 18 30 36 TRUE
9 9 19 21 37 TRUE
10 10 20 22 38 TRUE
现在我想将那些行的列 E 的值更改为 FALSE
- B 列中的值小于 0.1 分位数或大于 B 列中所有值的 0.9 分位数或
- 如果相同的条件适用于列 C OR
- 如果相同的条件适用于 D 列
所以生成的数据框应该是这样的:
A B C D E
1 1 11 23 39 FALSE
2 2 12 24 40 FALSE
3 3 13 25 31 FALSE
4 4 14 26 32 TRUE
5 5 15 27 33 TRUE
6 6 16 28 34 TRUE
7 7 17 29 35 TRUE
8 8 18 30 36 FALSE
9 9 19 21 37 FALSE
10 10 20 22 38 FALSE
我写了一个脚本,只根据一行改变数据框,效果很好:
DF <- DF %>%
dplyr::mutate(E = if_else(B < quantile(B, 0.9), E, FALSE)) %>%
dplyr::mutate(E = if_else(B > quantile(B, 0.1), E, FALSE))
DF
A B C D E
1 1 11 23 39 FALSE
2 2 12 24 40 TRUE
3 3 13 25 31 TRUE
4 4 14 26 32 TRUE
5 5 15 27 33 TRUE
6 6 16 28 34 TRUE
7 7 17 29 35 TRUE
8 8 18 30 36 TRUE
9 9 19 21 37 TRUE
10 10 20 22 38 FALSE
但是,当我尝试使这个动态化时,它不起作用:
for (col in cols) {
DF <- DF %>%
dplyr::mutate_(E = if_else(col < quantile(col, 0.9), E, FALSE)) %>%
dplyr::mutate_(E = if_else(col > quantile(col, 0.1), E, FALSE))
}
Error in (1 - h) * qs[i] : non-numeric argument to binary operator
我该如何解决这个问题?
【问题讨论】:
-
你试过
mutate_each吗? -
我认为 mutate_each 在这种情况下不起作用,因为我只想改变 E 列,而不是所有列