gpt4 book ai didi

R dplyr::mutate with ifelse 以全局变量为条件回收第一行的结果

转载 作者:行者123 更新时间:2023-12-04 09:19:31 25 4
gpt4 key购买 nike

我很好奇为什么 dplyr::mutate() 调用中的 ifelse() 语句似乎只适用于我的数据框的第一行。这将返回一个值,该值在整个列中循环使用。由于在 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

xy 仅定义为数据框的列时,为什么我必须明确指定 rowwise()

最佳答案

这与 dplyr::mutate 没有真正的关系,但与 ifelse 的工作方式有关,这里是文档 ?ifelse:

ifelse returns a value with the same shape as test which is filled with elements selected from either yes or no depending on whether the element of test is TRUE or FALSE.

Usage

ifelse(test, yes, no)

例子:

ifelse(T, c(1,2,3), c(2,3,4))
# [1] 1

您的第一个案例是向量化的,ifelse 将向量 x/yx-y 作为 yes参数,因为checkVar == 1返回TRUE(标量),ifelse返回(x/y) [1],即向量 x/y 的第一个元素,即 11 并被回收以填充新列 z;

在你的第二种情况下,mutateifelse 是每行执行的,所以它被评估了 5 次,每次都返回值该行的 x/y


如果你的条件是标量,那么你不需要向量化 ifelseif/else更适合使用:

checkVar <- 1
mutate(df, z = if(checkVar == 1) x/y else x-y)

# x y z
#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

关于R dplyr::mutate with ifelse 以全局变量为条件回收第一行的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46614059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com