【问题标题】:How can I use if else to change values in some rows and columns in my data frame in R?如何使用 if else 更改 R 中数据框中某些行和列的值?
【发布时间】:2016-05-27 00:34:24
【问题描述】:

我有一个包含 200 行和 150 列的数据框。在这些列中,我希望更改大约 50 行和 100 列的 NA。

以下是我的数据框(一小部分)的示例:

    >df
       Bird  Mammal  Type
    1    NA    1     A
    2    1     0     B
    3    1     0     A
    4    0     NA    A
    5    NA    1     A
    6    0     0     B
    7    0     0     A
    8    NA    NA    A 
    9    1     1     B
    10   1     1     A

我想要的是,仅将“A”类型的所有 NA 更改为 0,而不是“B”类型。对于类型“B”,我希望一切都保持不变。

我尝试使用各种 ifelse 选项来做到这一点,但我认为我仍然没有掌握它的窍门。以下是我尝试过的一些事情:

a) 仅将列子集为列表:

    try <- c(1,2)

    for(i in 1:length(try)){
    df[,try[i]] <- ifelse(df[,is.na(try[i])],0,df[,try[i]])
    }

b) 对行和列进行子集化(这给了我一个数据框,所以当然 ifelse 没有运行)

【问题讨论】:

  • df[is.na(df$Mammal) & df$Type=="A","Mammal"]=0;df[is.na(df$Bird) & df$Type= ="A","鸟"]=0;

标签: r if-statement subset


【解决方案1】:

这是一个非常简单的班轮,可以完全满足您的需求。无需循环或应用。

df[is.na(df) & df$Type=='A'] <- 0

【讨论】:

    【解决方案2】:

    您可以结合使用 lapply 和 ifelse。 假设您有一个索引向量或列名称,其中 NA 存储为 cols,您可以执行以下操作:

    df[ ,cols] <- as.data.frame(lapply(cols, 
                  FUN = function(x) ifelse(df$Type == "A" & is.na(df[,x]), 0, df[, x])))
    

    【讨论】:

      【解决方案3】:

      这是一个使用来自data.tableset 的选项。我们正在考虑除“类型”列之外的所有其他列。 set 选项很快。此外,这会更改列中的值而不转换为逻辑矩阵。

      library(data.table)
      setDT(df)
      nm1 <- setdiff(names(df), 'Type')
      for(j in nm1){
        set(df, i= which(is.na(df[[j]]) & df$Type=='A'), j=j, value=0)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-28
        • 2022-12-06
        • 2021-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多