我有一个像这样的data.table:
dt <- data.table(asset=c("x1","x2","x3","x4","x5"),
min_s1=c(.1,NA,NA,.1,NA),
min_s2=c(NA,.5,.5,NA,NA),
min_s3=c(.15,NA,NA,NA,.15))
我可以手动对NA值进行子集,如下所示,它给出了我想要的输出:
empty1 <- dt[is.na(min_s1)]
empty2 <- dt[is.na(min_s2)]
empty3 <- dt[is.na(min_s3)]
但是,我真正需要做的是使用列名动态子集,并在循环中将结果命名为i变量。循环很重要,因为这最终将用于并行计算脚本。我想要这样的东西(它不起作用;只显示我要找的东西):
foreach (i in 1:3) %do% {
empty(i) <- dt[is.na(min_s(i))]
}
我尝试使用以下内容以及其中的许多变体都无济于事:
paste0("empty",i) <- dt[is.na(paste0("min_s",i))]
我有什么想法可以做到这一点? 我使用的是Windows 7 pc。 感谢。
答案 0 :(得分:1)
我希望我能正确理解您的问题,请尝试以下方法:
dt <- data.table(asset=c("x1","x2","x3","x4","x5"),
min_s1=c(.1,NA,NA,.1,NA),
min_s2=c(NA,.5,.5,NA,NA),
min_s3=c(.15,NA,NA,NA,.15))
vec_store <- c()
empty <- list()
names <- names(dt)[!grepl("asset", names(dt))]
for(i in names){
vec_store <- dt[is.na(dt[,get(i)])]
empty[[paste0(i)]] <- vec_store
}
这会给你:
> empty
$min_s1
asset min_s1 min_s2 min_s3
1: x2 NA 0.5 NA
2: x3 NA 0.5 NA
3: x5 NA NA 0.15
$min_s2
asset min_s1 min_s2 min_s3
1: x1 0.1 NA 0.15
2: x4 0.1 NA NA
3: x5 NA NA 0.15
$min_s3
asset min_s1 min_s2 min_s3
1: x2 NA 0.5 NA
2: x3 NA 0.5 NA
3: x4 0.1 NA NA
在您的代码中,您无法使用paste0(empty,i)
来创建对象,我发现最简单的方法是创建一个空向量或data.table,然后将其存储在列表中。进入列表后,您可以对列表执行操作,也可以单独将其从列表中删除。这就是我创建vec_store
空向量,empty
空列表的原因。
希望有所帮助。
答案 1 :(得分:1)
我们可以使用lapply
遍历'min'列并对数据集
lapply(dt[,-1, with =FALSE], function(x) dt[is.na(x)])
#$min_s1
# asset min_s1 min_s2 min_s3
#1: x2 NA 0.5 NA
#2: x3 NA 0.5 NA
#3: x5 NA NA 0.15
#$min_s2
# asset min_s1 min_s2 min_s3
#1: x1 0.1 NA 0.15
#2: x4 0.1 NA NA
#3: x5 NA NA 0.15
#$min_s3
# asset min_s1 min_s2 min_s3
#1: x2 NA 0.5 NA
#2: x3 NA 0.5 NA
#3: x4 0.1 NA NA