R-根据逻辑向量有效替换可变数量的Na值

  • 本文关键字:Na 替换 有效 向量 r dataframe
  • 更新时间 :
  • 英文 :


我试图根据数据框中的一列的逻辑返回在数据框中替换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

如果矩阵很大,则逻辑矩阵也将很大,这可能会产生与内存有关的问题。

最新更新