【问题标题】:Conditional replacement of specific row values特定行值的条件替换
【发布时间】:2016-06-20 21:56:51
【问题描述】:

我有条件替换的问题。假设我有以下数据框代码

a=c("0","1","0","B","NA","NA","NA","NA","NA")
b=c(0,1,0,0,1,0,1,0,1)
c=c(0,0,0,0,1,0,0,1,1)
d=c("0","1","0","0","1","0","B","NA","NA")
dat=data.frame(rbind(a,b,c,d))
names(dat)=c("P1","P2","P3","P4","C1","C2","C3","C4","C5")

现在,如果这些值之一是 B,我想用 NA 替换 P1:P4 的行值,如果这些值之一是 B,我还想用 NA 替换 C1:C5 的行值。所以我想要数据框看起来像这样:

a=c(**"NA","NA","NA","NA"**,"NA","NA","NA","NA","NA")
b=c(0,1,0,0,1,0,1,0,1)
c=c(0,0,0,0,1,0,0,1,1)
d=c("0","1","0","0",**"NA","NA","NA"**,"NA","NA")
dat=data.frame(rbind(a,b,c,d))
names(dat)=c("P1","P2","P3","P4","C1","C2","C3","C4","C5")

我希望这个问题是可以理解的,如果能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: r replace row conditional


    【解决方案1】:

    考虑到 dat 是提供的原始数据框,我提供了一个相对冗长的代码以便更好地理解。希望对您有所帮助。

    dat2 <- data.frame()
    for(i in 1:nrow(dat)){
    
      datSubset <- with(dat, dat[i,])
      col.num.of.B <- which(datSubset == "B", arr.ind = T)[2]
      if(is.na(col.num.of.B)){
        datSubset <- datSubset
      } else if(col.num.of.B < 5) {
        datSubset[,c(1:4)] <- NA
      } else {
        datSubset[,c(5:9)] <- NA
      }
    
      dat2 <- rbind(dat2, datSubset) 
    }
    

    dat2
    #    P1   P2   P3   P4   C1   C2   C3   C4   C5
    
    # a <NA> <NA> <NA> <NA>   NA   NA   NA   NA   NA
    # b    0    1    0    0    1    0    1    0    1
    # c    0    0    0    0    1    0    0    1    1
    # d    0    1    0    0 <NA> <NA> <NA> <NA> <NA>
    

    【讨论】:

    • 谢谢你们。这正是我所需要的:)
    • @Lilly - 如果答案与您的问题相符,请将其标记为正确答案。 :)
    【解决方案2】:

    据我了解...如果在 P1 到 P4 列中找到值 B,则将 P1 到 P4 中的所有值设置为 NA

    你可以试试:

    nm <- c("P1", "P2", "P3", "P4")
    cols <- which(names(dat) %in% nm) 
    dat[,cols][any(dat[,cols] == "B")] <- NA
    
    dat
    #   P1 P2 P3 P4 C1 C2 C3 C4 C5
    # a NA NA NA NA NA NA NA NA NA
    # b NA NA NA NA  1  0  1  0  1
    # c NA NA NA NA  1  0  0  1  1 
    # d NA NA NA NA  1  0  B NA NA
    

    如果您只想将其应用于第一行,请使用dat[1,cols][any(dat[,cols] == "B")] &lt;- NA

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2017-05-06
      相关资源
      最近更新 更多