基于逻辑向量有效地替换可变数量的NA值

时间:2016-06-21 03:54:24

标签: 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)

我试图在NA时用0填充e == 1 s,同时仍然保留我放在其他4列中的随机1(特别是其余值为NA的那些) 。 我尝试过创建循环:

for(i in 1:nrow(df)){
  if(df[,'e']==1){
    df[i,is.na(df[i,1:4])] <- 0 
  }
}
然而,这会清除我的逻辑列和我的观察数据。

我想要应用它的数据框是大的(280万行X 23 col),其中包含元数据和观察数据,所以考虑速度的东西会很棒。

1 个答案:

答案 0 :(得分:1)

我们可以使用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?set)的帮助页面,可以通过调用它来避免[.data.table的开销。

正如@thelatemail所提到的那样,紧凑的base R选项将是

df[,1:4][df[,"e"]==1 & is.na(df[,1:4])] <- 0

如果矩阵非常大,逻辑矩阵也会很大,并且可能会产生与内存相关的问题。