【问题标题】:My zero values matter and case_when is removing them我的零值很重要,case_when 正在删除它们
【发布时间】:2021-04-15 21:17:02
【问题描述】:

我有一个 2X2 设计(它更复杂,但下面是一个简单的例子来说明我的问题)。

假设我的输出数据如下所示:

图中,ID是每个参与者,block number是他们看到的条件,每个人看到了4个问题。

平衡发挥作用的地方(例如)是相同的项目(例如项目 1)在 Q1-Q4 之间的不同位置重复出现在参与者之间,具体取决于区块。在上图中,Item1 将是红色数字。我使用 case_when 提取组合并给我一个干净的 Item1 响应列:

data <- data %>% mutate(
  Item1= case_when(
    BlockNumber == 'Block1' & Q1 ~ Q1, 
    BlockNumber == 'Block5' & Q2 ~ Q2,
    BlockNumber == 'Block6' & Q3 ~ Q3,
    BlockNumber == 'Block7' & Q4 ~ Q4))

这给了我类似的东西:


代码完全按照我的需要做,但零值正在下降 [在图片中突出显示]。

它不是零,而是一个 NA 值。像这样的东西: enter image description here

问题是零在我的数据中是有意义的,我需要保留它们。

有人知道我可以添加/使用什么代码来避免这种情况吗?之后它真的搞砸了我的平均分数,因为零被丢弃了。

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。请不要张贴数据图片。我们不能轻易地将其复制/粘贴到 R 中进行测试。
  • @VVO 我认为你误解了这个问题。不是 0 导致它,而是当 blocknumber 大于 4 返回 null 时你的情况。你需要添加更多的情况。
  • 我相信应该说Block5 来获取Q2 中你用红色标记的数字 - 这不正确吗?
  • 我还是不明白这个问题。在您的顶部表格屏幕截图中,BlockNumber 是一个包含从 1 到 8 的数字的字段。您的测试检查 BlockNumber 中的任何这些值是否与“Block1”之类的文本匹配,这将始终为假,因为没有任何表的该列中包含“阻止”一词的值。我认为值表或代码不是您正在使用的,否则我不明白它是如何为您工作的。
  • 抱歉,我刚刚意识到图片并不能准确反映我的数据。在我的数据中,BlockNumber 列包含因子“Block1”“Block2”“Block3”。 @William Gram 发现的问题是我过度指定了。我所需要的只是 BlockNumber== 'Block5' ~ Q1 告诉 R 从哪里获取值。然而,我在 &Q1 中添加了额外的信息,这给了我一个错误,因此返回了一个 NA。

标签: r case-when


【解决方案1】:
data <- data %>% mutate(
  Item1= case_when(
    BlockNumber == 'Block1' & Q1 ~ Q1, 
    BlockNumber == 'Block4' & Q2 ~ Q2,
    BlockNumber == 'Block6' & Q3 ~ Q3,
    BlockNumber == 'Block7' & Q4 ~ Q4,

    # Get ready for some magic!
    TRUE ~ 0))

如果您想在其他测试未通过的情况下指定一个值,您可以使用 TRUE 作为最后一个“测试”来使用该值。

否则,任何未通过先前测试的情况都会输出 NA。

【讨论】:

    【解决方案2】:

    我相信您遇到这种情况的原因是整数 0 的计算结果为 FALSE。也就是说,在BlockNumber == 'Block5' 所在的行中,您有Q2 == 0,这意味着您正在询问BlockNumber == 'Block5' &amp; FALSE 的情况,即FALSE。因此,对于这种情况,您会得到 NA。

    从您的解释看来,您实际上并不需要第二个条件,所以您可以做的是简化您的 case_when 操作:

    data %>% mutate(
      Item1= case_when(
        BlockNumber == 'Block1' ~ Q1, 
        BlockNumber == 'Block5' ~ Q2,
        BlockNumber == 'Block6' ~ Q3,
        BlockNumber == 'Block7' ~ Q4))
    

    至少我不明白你为什么需要&amp; Qx 条件。但如果我误解了什么,请告诉我。

    【讨论】:

    • 啊!非常感谢!!!这正是问题所在。我以为我需要过度指定,但我不需要 & Qx,我现在得到了零。谢谢!
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多