如何使用if else更改R中数据框中某些行和列的值?

时间:2016-02-15 22:49:29

标签: r if-statement subset

我有一个包含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

我想要的是将所有NAs更改为0仅用于类型" A",而不是类型" 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没有运行)

3 个答案:

答案 0 :(得分:3)

这是一个非常简单的衬垫,可以完全满足您的需求。没有循环或需要申请。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

以下是set使用data.table的选项。我们正在考虑除&#39; Type&#39;之外的所有其他列。柱。 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)
}