Заменить значение в столбце в зависимости от другого столбца в dplyr

Здравствуйте, у меня есть кадр данных, такой как

COL1 COL2 COL3 
A    nan  NaN 
B    ET1  Carnivora
C    ET1  NaN 
D    ET2  Fish
E    OK   Aves 
F    ET3  NaN 

и у меня есть список

List_ET<-c("ET1","ET2","ET3","nan")

И я хотел бы заменить все значения df$COL3, если соответствующий df$COL2 присутствует в этом списке, на Unknown, но если df$COL3 не NaN, я ничего не делаю.

чем я должен получить:

COL1 COL2 COL3 
A    nan  Unknown 
B    ET1  Carnivora
C    ET1  Unknown 
D    ET2  Fish
E    OK   Aves 
F    ET3  Unknown 

Вот кадр данных

structure(list(COL1 = structure(1:6, .Label = c("A", "B", "C", 
"D", "E", "F"), class = "factor"), COL2 = structure(c(4L, 1L, 
1L, 2L, 5L, 3L), .Label = c("ET1", "ET2", "ET3", "nan", "OK"), class = "factor"), 
    COL3 = structure(c(4L, 2L, 4L, 3L, 1L, 4L), .Label = c("Aves", 
    "Carnivora", "Fish", "NaN"), class = "factor")), class = "data.frame", row.names = c(NA, 
-6L))

До сих пор я пытался

df$COL3[df$COL2 %in% List_ET]<- "Unknown" 

Но не включено ничего не делать, когда df$COL3 не NaN


person Grendel    schedule 22.01.2021    source источник
comment
Я думал использовать: df$COL3[df$COL2 %in% List_ET & !is.na(df$COL3)]<- "Unknown" но, похоже, это не работает   -  person Grendel    schedule 22.01.2021
comment
в предоставленных вами данных COL3 не имеет NA. NaN - это символ в ваших данных.   -  person Edo    schedule 22.01.2021
comment
Кроме того, то, что вы написали, не работает должным образом, потому что и COL2, и COL3 являются факторами, а не символами.   -  person Edo    schedule 22.01.2021
comment
Да, я это знаю, поэтому мне нужно решение   -  person Grendel    schedule 22.01.2021
comment
Поскольку вы работаете с факторами, вам нужно сначала изменить уровни. См. предложенный ответ. Надеюсь, поможет   -  person AnilGoyal    schedule 22.01.2021


Ответы (2)


ИЗМЕНИТЬ возможно, вы ищете этот цикл

levels(df$COL3) <- c("Aves", "Carnivora", "Fish", "NaN", "Unknown")

for(i in seq_along(df$COL3)){
  if(df$COL2[i] %in% List_ET & df$COL3[i] == "NaN"){
    df$COL3[i] <- "Unknown"
  }
}

> df
  COL1 COL2      COL3
1    A  nan   Unknown
2    B  ET1 Carnivora
3    C  ET1   Unknown
4    D  ET2      Fish
5    E   OK      Aves
6    F  ET3   Unknown

Но если вы просто хотите заменить NaN в col3 на "Unknown", используйте это просто

levels(df$COL3) <- c("Aves", "Carnivora", "Fish", "Unknown")

> df$COL3
[1] Unknown   Carnivora Unknown   Fish      Aves      Unknown  
Levels: Aves Carnivora Fish Unknown

#OR
> df
  COL1 COL2      COL3
1    A  nan   Unknown
2    B  ET1 Carnivora
3    C  ET1   Unknown
4    D  ET2      Fish
5    E   OK      Aves
6    F  ET3   Unknown
person AnilGoyal    schedule 22.01.2021

Возможно, вам нужно type.convert вместо df, а затем использовать ifelse, например,

within(
  type.convert(df, as.is = TRUE),
  COL3 <- ifelse(COL2 %in% List_ET & COL3 == "NaN", "Unknown", COL3)
)

который дает

  COL1 COL2      COL3
1    A  nan   Unknown
2    B  ET1 Carnivora
3    C  ET1   Unknown
4    D  ET2      Fish
5    E   OK      Aves
6    F  ET3   Unknown
person ThomasIsCoding    schedule 22.01.2021