将NA分配到R中的数据帧中



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

我想创建一个额外的列(就像示例中名为Desire_Output的列一样(,我将在其中为Value列中数字大于1的任何行分配NA。此外,我想将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{
}
}

请告诉我,如果你有一个最简单的方法来做任何其他方法。

我们可以首先将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

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

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

我希望这会有所帮助。

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

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]
}
}
}

最新更新