【问题标题】:Assigning NAs into a dataframe in R将 NA 分配到 R 中的数据帧中
【发布时间】:2020-08-16 14:24:40
【问题描述】:

我一直在尝试使用 for 循环来分配 NA,但它不起作用,我知道有可能最简单的方法来做到这一点。

我想创建一个额外的列(就像示例中名为 Desire_Output 的列一样),我将在其中将 NA 分配给 Value 列中数字大于 1 的任何行。此外,我想将 NA 分配给接下来的两行。如果 Value 列中有 NA,只需将 NA 也放入所需的输出列中即可。

示例如下:

Event<- c(1,2,2,2,2,2,2,3,3,4,4,4,4,4,5,6,6,6,7)
Value<- c(5,3,0,0,0,2,0,1,10,0,0,NA,NA,NA,1,0,8,0,0)
Desire_output<- c(NA,NA,NA,NA,0,NA,NA,NA,NA,NA,NA,NA,NA,NA,1,0,NA,NA,NA)
A<- data.frame(Event,Value,Desire_output)


   Event Value Desire_output
1      1     5            NA
2      2     3            NA
3      2     0            NA
4      2     0            NA
5      2     0             0
6      2     2            NA
7      2     0            NA
8      3     1            NA
9      3    10            NA
10     4     0            NA
11     4     0            NA
12     4    NA            NA
13     4    NA            NA
14     4    NA            NA
15     5     1             1
16     6     0             0
17     6     8            NA
18     6     0            NA
19     7     0            NA

这是我尝试做的,但是当我在 Value 列中找到 NA 时,我开始遇到一些麻烦。

for (f in 1:(nrow(A)-1)){
  if(A$Value2[f] > 1){
    A$Value2[f]<- NA
    A$Value2[f+1]<- NA
    A$Value[f+2]<- NA
     }else{
  }
}

如果您有任何其他方法最简单的方法,请告诉我。

【问题讨论】:

    标签: r dataframe for-loop if-statement dplyr


    【解决方案1】:

    我认为这可以满足您的需求,但其他解决方案可能不那么费力。

    Event<- c(1,2,2,2,2,2,2,3,3,4,4,4,4,4,5,6,6,6,7)
    Value<- c(5,3,0,0,0,2,0,1,10,0,0,NA,NA,NA,1,0,8,0,0)
    
    A<- data.frame(Event,Value,Desired_output) 
    
    A["Desired_Output"] <- 0
    
    for(i in seq(length(A$Value))){
    
      if(!is.na(A$Desired_Output[i])){
    
        if(A$Value[i] > 1 & !is.na(A$Value[i])){
    
          A$Desired_Output[c(i, i+1, i+2)] <- NA
    
        }else if(is.na(A$Value[i])){
    
          A$Desired_Output[i] <- NA
    
        }else{
    
          A$Desired_Output[i] <- A$Value[i]
    
        }
    
      }
    
    }
    

    【讨论】:

    • 我不清楚你在这最后两句话中的意思:“另外,我想将 NA 分配给接下来的两行。如果 Value 列中有 NA,也只需放置 NA在欲望输出栏中。”请您指出您希望代码做什么,我会看看是否可以提供更好的答案。
    • 当然,James,在 A 数据框中,名为“Desired output”的列正是我想要的代码结果。因此,首先,如果 Value 列中的数字大于 1,则在“Desire_output”列中为其分配一个 NA,不仅针对该行,还为接下来的两行 (i+1) 和 (i+ 2)。就像它显示在欲望输出列中一样
    • 例如在第 2 行中,“Value”列的数字 = 3,这意味着它大于 1。因此,在“Desire_Output”列中,它被分配了一个 NA同一行。如果 Value 列中的数字大于 1,我还想将 NA 分配给以下两行。因此,对于接下来的两行(第 3 行和第 4 行),我需要分配 NA(这就是 Desire_output 第 3 和第 4 列中有 NA 的原因。同样的条件适用于整个数据帧。
    • 感谢您的澄清,我已经更新了我的回复。原来我不知道如何在没有循环的情况下做到这一点!
    【解决方案2】:

    您可以使用 ifelse。在下面的代码中,我在 ifelse 代码中使用了 OR 语句。

    A$Desire_output<- ifelse(A$Value>1 | is.na(A$Value), NA, A$Value)
    

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的回答,但它仅将 NA 分配给值大于 1 的行,而不是 NA 之后的两行。
    【解决方案3】:

    我们可以先将Value 列复制到Desired_output 列,找出Value 大于1 的索引(inds),然后将NA 添加到该行和接下来的两行。

    A$Desired_output <- A$Value
    inds <- which(A$Value > 1)
    A$Desired_output[unique(c(inds, inds + 1, inds + 2))] <- NA
    A
    
    #   Event Value Desired_output
    #1      1     5             NA
    #2      2     3             NA
    #3      2     0             NA
    #4      2     0             NA
    #5      2     0              0
    #6      2     2             NA
    #7      2     0             NA
    #8      3     1             NA
    #9      3    10             NA
    #10     4     0             NA
    #11     4     0             NA
    #12     4    NA             NA
    #13     4    NA             NA
    #14     4    NA             NA
    #15     5     1              1
    #16     6     0              0
    #17     6     8             NA
    #18     6     0             NA
    #19     7     0             NA
    

    【讨论】:

    • 嗨 Ronak Shah,回到这个问题,如果最后一个 Value 大于 1,你将如何修改代码?我尝试使用数据框,但它给了我一个错误,显然是因为它将 NA 分配给最后一行,还有最后一行 +1 和 +2(这些行不存在)。如何处理这个问题?我尝试了一个 for 循环,但想知道是否有更简单的方法。
    • 你可以这样做:newinds &lt;- unique(c(inds, inds + 1, inds + 2)) 然后只保留那些少于行数的。 newinds &lt;- newinds[newinds &lt;= nrow(A)] 并用它来赋值A$Desired_output[newinds] &lt;- NA
    • 太棒了!谢谢罗纳克。
    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2021-06-27
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多