循环动态列

Loop through dynamic columns

假设我有这个 df

require(data.table)

df <- data.table(a = 1:2
                 , b = 3:4
                 , c = 5:6
                 ); df

   a b c
1: 1 3 5
2: 2 4 6

我想一次获取 2 列,例如c('a', 'b') 然后是 c('a', 'c')。我试过了:

x <- c('b', 'c')

for (i in x)
{
  print( df[, c('a', i)]  )
}

它没有返回具有指定列的数据 table,而是只返回指定列名的向量:

[1] "a" "b"
[1] "a" "c"

我做错了什么?谢谢。

1) with 使用末尾注释中可重复显示的输入添加 with=FALSE

for (i in x) {
  print( df[, c('a', i), with = FALSE]  )
}

给予:

   a b
1: 1 3
2: 2 4
   a c
1: 1 5
2: 2 6

2) dot dot 这也可以工作并给出相同的结果。

for (i in x) {
  cn <- c('a', i)
  print( df[, ..cn]  )
}

3) .SD 我们可以像这样将 .SD.SDcols 一起使用:

for (i in x) {
  print( df[, .SD, .SDcols = c("a", i)]  )
}

4) subset 我们可以使用subset函数。它有一个 data.table 方法。

for (i in x) {
  print( subset(df, select = c('a', i)) )
}

5) data.frame 此外,如果您使用数据框而不是 data.table 那么它可以在没有上述任何条件的情况下工作。

DF <- as.data.frame(df)
for (i in x) {
  print( DF[, c('a', i)]  )
}

给予:

  a b
1 1 3
2 2 4
  a c
1 1 5
2 2 6

备注

问题缺少 x 的库语句和定义,因此我们使用了以下内容。

library(data.table)

df <- data.table(a = 1:2
                 , b = 3:4
                 , c = 5:6
                 ); df

x <- c("b", "c")