【问题标题】:Replace vaue in column depending on another column in dplyr根据 dplyr 中的另一列替换列中的值
【发布时间】:2021-01-22 11:24:42
【问题描述】:

您好,我有一个数据框,例如

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$COL2 存在于该列表中,我想用Unknown 替换所有df$COL3 值,但如果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时什么都不做

【问题讨论】:

  • 我想用:df$COL3[df$COL2 %in% List_ET &amp; !is.na(df$COL3)]&lt;- "Unknown" ,但它似乎不起作用
  • 在您提供的数据中 COL3 没有 NA。 “NaN”是您数据中的一个字符。
  • 另外,你写的东西不能正常工作,因为COL2和COL3都是因子而不是字符
  • 是的,我知道,这就是我需要解决方案的原因
  • 由于您使用的是因子,因此您必须先修改级别。请参阅建议的答案。希望对你有帮助

标签: r dataframe dplyr refactoring factors


【解决方案1】:

编辑 也许你正在寻找这个循环

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

但如果只是想将 col3 中的 NaN 替换为 "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

【讨论】:

    【解决方案2】:

    也许你需要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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 2021-10-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      相关资源
      最近更新 更多