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

如何使用if-else更改R中数据框中某些行和列中的值?,r,if-statement,subset,R,If Statement,Subset,我有一个200行150列的数据框。在这些列中,我希望更改大约50行和100列的NAs 下面是我的数据框(一小部分)的示例: >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

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

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

    >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”的所有NAs更改为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]])
    }

试试你可以结合使用lappy和ifelse。
假设您有一个索引向量或列名,NAs存储为
cols
,您可以执行以下操作:

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

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

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

df[,cols]这里有一个非常简单的一行程序,它能准确地得到您想要的东西。不需要循环或应用

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

df[is.na(df)&df$Type=='A']这里有一个非常简单的一行程序,它完全符合您的需要。不需要循环或应用

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

df[is.na(df)&df$Type=='A']这里有一个使用
set
from
data.table
的选项。我们正在考虑除“类型”列之外的所有其他列。
设置
选项速度很快。此外,这是在不转换为逻辑矩阵的情况下更改列中的值

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)
}
库(data.table)
setDT(df)

nm1这里有一个选项,使用
数据表中的
设置
。我们正在考虑除“类型”列之外的所有其他列。
设置
选项速度很快。此外,这是在不转换为逻辑矩阵的情况下更改列中的值

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)
}
库(data.table)
setDT(df)
nm1 df[is.na(df$哺乳动物)&df$Type==“A”,“哺乳动物”]=0;df[is.na(df$Bird)&df$Type==“A”,“Bird”]=0;df[is.na(df$哺乳动物)&df$Type==“A”,“哺乳动物”]=0;df[is.na(df$Bird)&df$Type==“A”,“Bird”]=0;