R 我的零值很重要,当你删除它们的时候

R 我的零值很重要,当你删除它们的时候,r,case-when,R,Case When,我有一个2X2的设计(它更复杂,但下面有一个简单的例子来说明我的问题) 假设我的输出数据如下所示: 在图中,ID是每个参与者,区块编号是他们看到的条件,每个人都看到了4个问题 平衡发挥作用的地方(例如)是,根据区块的不同,同一项目(例如,项目1)在第1季度至第4季度之间在参与者的不同位置重复。在上图中,Item1是红色数字。我使用case_来提取组合,并为我提供一列完整的Item1响应: data <- data %>% mutate( Item1= case_when(

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

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

在图中,ID是每个参与者,区块编号是他们看到的条件,每个人都看到了4个问题

平衡发挥作用的地方(例如)是,根据区块的不同,同一项目(例如,项目1)在第1季度至第4季度之间在参与者的不同位置重复。在上图中,Item1是红色数字。我使用case_来提取组合,并为我提供一列完整的Item1响应:

data <- data %>% mutate(
  Item1= case_when(
    BlockNumber == 'Block1' & Q1 ~ Q1, 
    BlockNumber == 'Block5' & Q2 ~ Q2,
    BlockNumber == 'Block6' & Q3 ~ Q3,
    BlockNumber == 'Block7' & Q4 ~ Q4))
数据%mutate(
第1项=情况(
BlockNumber=='Block1'&Q1~Q1,
BlockNumber=='Block5'&Q2~Q2,
BlockNumber=='Block6'&Q3~Q3,
区块编号==‘区块7’&第四季度至第四季度)
这让我有点像:


代码正在做我需要它做的事情,但是零值被删除[在图片中突出显示]

它不是零,只是一个NA值。大概是这样的:

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

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

数据%发生了变化(
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))
第1项=情况( BlockNumber=='Block1'&Q1~Q1, BlockNumber=='Block4'&Q2~Q2, BlockNumber=='Block6'&Q3~Q3, BlockNumber=='Block7'&Q4~Q4, #准备施展魔法吧! 真的(0)
如果要在其他测试未通过时指定一个值,可以使用TRUE作为最后一个“测试”来使用该值


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

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

根据您的解释,在我看来,您实际上并不需要第二个条件,因此您可以做的是简化您的
案例,当
操作:

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

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

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