我很好奇为什么dplyr::mutate()
呼叫内的ifelse()
声明似乎只适用于我的数据帧的第一行。这会返回一个值,它会在整个列中循环使用。由于在ifelse()
的任一情况下评估的表情只在我的数据帧的情况下有效,我希望被列上作为一个整体进行健康检查,并导致表达的评价,而不仅仅是他们的第一要素。[R dplyr ::与ifelse条件在全局变量变异回收结果从第一行
下面是一个例子:我的数据帧之外定义的变量称为checkVar
。取决于checkVar
的价值,我想不同的充值在新列,z
,被计算为现有列的功能添加到我的数据帧。
如果我做
checkVar <- 1
df <- data.frame(x=11:15, y=1:5) %>%
dplyr::mutate(z=ifelse(checkVar == 1, x/y, x-y))
df
返回
x y z
1 11 1 11
2 12 2 11
3 13 3 11
4 14 4 11
5 15 5 11
相反的z是x和y的每一行的商,所有行填充x的商和y从数据帧的第一行。
但是,如果我指定rowwise()
,我得到了我想要的结果:
df <- df %>%
dplyr::rowwise() %>%
dplyr::mutate(z=ifelse(checkVar == 1, x/y, x-y)) %>%
dplyr::ungroup()
df
回报
# A tibble: 5 x 3
x y z
<int> <int> <dbl>
1 11 1 11.000000
2 12 2 6.000000
3 13 3 4.333333
4 14 4 3.500000
5 15 5 3.000000
为什么我必须明确指定rowwise()
时x
和y
只能定义为列我的数据框?
'checkVar'是length' 1.本的',我相信,只会导致使用'x'和'y'的第一行。如果你设置了'checkVar < - rep(1,5)',你会得到你想要的结果。如果你使用'dplyr'的'if_else',它会告诉你问题是什么。另外,使用'rowwise'使得'ifelse'中的所有内容长度都是1. – Abdou
如果你使用'ifelse'的dplyr版本,它是'if_else',那么你得到错误'“true是长度5而不是1或1.“'。 – Marek