给定DF
下面的data.table,我想选择编号为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( )
?这些功能之一或仅工作一个的示例是否有任何优势?
此方法似乎有效:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句