我试图根据数据框中的一列的逻辑返回在数据框中替换NA值。
#Creating random example data frame
a <- rbinom(1000,1,.5)
b <- rbinom(1000,1,.75)
c <- rbinom(1000,1,.25)
d <- rbinom(1000,1,.5)
e <- rbinom(1000,1,.5) # Will be the logical column
df <- cbind(a,b,c,d)
for(i in 1:1000){
if(sum(df[i,1:4]) >2){
df[i,1:4] <- NA
}
}
# randomly replacing some of the NA to represent the observation data
df[sample(1:length(df), 100, replace=F)] <- 1
df <- cbind(df, e)
我试图用0填充NA
S时,当e == 1
仍保留了我放置在其他4列中的随机1s(尤其是其余值为Na的那些)时。我尝试过创建循环,例如:
for(i in 1:nrow(df)){
if(df[,'e']==1){
df[i,is.na(df[i,1:4])] <- 0
}
}
但是,这既清除我的逻辑列和观察数据。
我想将其应用于元数据和观察数据的大型数据框架(280万行X 23 Col),因此考虑到速度的东西将很棒。
我们可以使用 data.table
library(data.table)
df1 <- as.data.frame(df)
setDT(df1)
for(j in 1:4){
set(df1, i = which(df1[['e']]==1 & is.na(df1[[j]])), j = j, value = 0)
}
我们使用的是set
会更有效。通过调用set
的CC_5(?set
)开销的帮助页。
正如@thelatemail提到的,一个紧凑的base R
选项将为
df[,1:4][df[,"e"]==1 & is.na(df[,1:4])] <- 0
如果矩阵很大,则逻辑矩阵也将很大,这可能会产生与内存有关的问题。