根据data.table,DF
,我想选择除编号为6
和8
的组的第一行以外的所有行。有人告诉我应该使用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( )
?这些中的一个或者只有一个可以工作的例子是否有任何优势?
答案 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