我试图根据数据框中其中一列的逻辑返回来替换数据框中的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),其中包含元数据和观察数据,所以考虑速度的东西会很棒。
答案 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
如果矩阵非常大,逻辑矩阵也会很大,并且可能会产生与内存相关的问题。