data.table和.SDcols with paste0创建一个字符向量

时间:2016-07-18 18:17:44

标签: r data.table

根据data.table,DF,我想选择除编号为68的组的第一行以外的所有行。有人告诉我应该使用paste0( )。我有一个解决方案,可以提供预期的结果,但没有paste0( )

DF <- data.table(grp=c(6,6,8,8,8), Q1=c(2,2,3,5,2), Q2=c(5,5,4,4,1), Q3=c(2,1,4,2,4), H1=c(3,4,5,2,4), H2=c(5,2,4,1,2) )

期望的结果:

desired_result <- data.table(grp=c(6,8,8), Q1=c(2,4,2), Q2=c(5,4,1), Q3=c(1,2,4) )

实现此结果的一种方法:

DF[ , .SD[-1], .SDcols = c("Q1", "Q2", "Q3"), by = grp]

如何使用paste0( )而不是c( )?这些中的一个或者只有一个可以工作的例子是否有任何优势?

1 个答案:

答案 0 :(得分:4)

这种方法似乎有效:

DF[ , .SD, .SDcols = paste0("Q", 1:3), by = grp]

   grp Q1 Q2 Q3
1:   6  2  5  2
2:   6  2  5  1
3:   8  3  4  4
4:   8  5  4  2
5:   8  2  1  4

将一种方法与另一种方法进行比较。

all.equal(DF[ , .SD, .SDcols = c("Q1", "Q2", "Q3"), by = grp],
          DF[ , .SD, .SDcols = paste0("Q", 1:3), by = grp])
[1] TRUE

请注意.SDcols选择列,与删除每个组的第一行无关。 .SDcols可以使用字符向量,paste0生成字符向量,因此选择列可以以任何方式工作。

删除每个组的第一行的一种方法是tail,其中包含paste0函数的轻率:

DF[ , tail(.SD, -1), .SDcols = paste0("Q", 1:3), by = grp]
   grp Q1 Q2 Q3
1:   6  2  5  1
2:   8  5  4  2
3:   8  2  1  4