Назначение NA в информационный фрейм в R - PullRequest
0 голосов
/ 02 мая 2020

Я пытался назначить NA, используя для l oop, но не работает, и я знаю, что есть самые простые способы сделать это.

Я хочу создать дополнительный столбец (точно так же, как столбец в примере с именем Desire_Output), в котором я назначу NA для любой строки, которая в столбце Value имеет номер больше 1. Кроме того, я хочу назначить NA для следующих двух следующих строк. Если в столбце Значение есть 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

Это то, что я пытался сделать, но когда я getvto NA в столбце Value У меня начались некоторые проблемы.

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

Пожалуйста, дайте мне знать, если у вас есть самый простой способ сделать это любым другим методом.

Ответы [ 3 ]

1 голос
/ 02 мая 2020

Я думаю, это дает то, что вы ищете, но другие решения могут быть менее трудоемкими.

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]

    }

  }

}
1 голос
/ 02 мая 2020

Вы можете использовать ifelse. В приведенном ниже коде я использовал оператор OR внутри кода ifelse.

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

Надеюсь, это поможет.

1 голос
/ 02 мая 2020

Сначала мы можем скопировать столбец Value в столбец Desired_output и найти индексы (inds), где Value больше 1, и добавить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...