使用paste0和变量

时间:2017-03-15 23:49:43

标签: r parallel-processing data.table

我有一个像这样的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。 感谢。

2 个答案:

答案 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