【问题标题】:dplyr mutate-ifelse combination not creating correct conditional variabledplyr mutate-ifelse 组合未创建正确的条件变量
【发布时间】:2018-06-24 15:24:37
【问题描述】:

我正在尝试使用 dplyr 中的 mutate 创建一个条件变量,这似乎对我不起作用。请参阅我尝试创建的示例数据框和组合得分变量。请注意,新变量“combined.score”的第三个观察值不是 B、C 和 D 的总和。似乎只计算了第一个观察值,并且该值用于每一行观察值。

我在这里缺少什么?想知道发生这种情况的原因(没有那么多替代代码或解决方案)

df <- 
  data.frame(B=c(1,0,0), 
             C=c(3,4,9), 
             D=c(1,1,0))

#A function to calculate stations whether there is a communication or process component or both
df <- df %>%
  mutate(combined.score = ifelse("B" %in% names(.) & "C" %in% names(.) & "D" %in% names(.), B + C + D,
                                 ifelse("B" %in% names(.) & "C" %in% names(.), B + C,
                                        B))) %>%
  mutate(combined.score.correct = B + C + D) 

【问题讨论】:

  • 请注意"B" %in% names(.) &amp; "C" %in% names(.) &amp; "D" %in% names(.)TRUEFALSEifelse 最适合用于逻辑值的向量的情况;你到底想用这个语句测试什么?
  • 请注意,rowSums(df) 提供的正是您想要的 combined.score
  • @MichaelChirico 第一个条件将返回 'TRUE',所以我希望它会计算 'combined.score' = B + C + D。很像 'combined.score.correct' 变量。我已经多次使用 mutate - ifelse 语句来处理数据帧,没有任何问题,为什么这种情况很特别?
  • @MichaelChirico:“你到底想测试什么来验证这个陈述?” ifelse 语句本身就是我在语句中测试的,即如果“B”、“C”和“D”存在,则计算 B + C + D。它不这样做,那为什么不呢?跨度>

标签: r dplyr


【解决方案1】:

ifelse 的文档说:

ifelse 返回一个与 与 test 形状相同的值

这里test"B" %in% names(df) &amp; "C" %in% names(df) &amp; "D" %in% names(df),它返回一个1元素向量

[1] TRUE

因此,ifelse 调用返回一个只有 B + C + D 的第一个元素的单元素向量,然后在整个向量中循环使用。

【讨论】:

  • 感谢您的解释。我现在看到 mutate - ifelse 组合最适合作为“分类器”功能。
  • 你可以使用这个有用的内联 if 函数来代替: # 长度不必匹配 iif
猜你喜欢
  • 2021-10-15
  • 2020-11-19
  • 2018-03-18
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
相关资源
最近更新 更多