如何使用 if else 更改 R 中数据框中某些行和列的值?
How can I use if else to change values in some rows and columns in my data frame in R?
我有一个包含 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 没有 运行)
您可以结合使用 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])))
这是一款非常简单的衬垫,可以满足您的需求。无需循环或应用。
df[is.na(df) & df$Type=='A'] <- 0
这是一个使用 data.table
中的 set
的选项。我们正在考虑除 'Type' 列之外的所有其他列。 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)
}
我有一个包含 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 没有 运行)
您可以结合使用 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])))
这是一款非常简单的衬垫,可以满足您的需求。无需循环或应用。
df[is.na(df) & df$Type=='A'] <- 0
这是一个使用 data.table
中的 set
的选项。我们正在考虑除 'Type' 列之外的所有其他列。 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)
}