我一直试图通过使用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]
}
}
}