【问题标题】:Is there some way to keep variable names from.SD+.SDcols together with non .SD variable names in data.table?是否有某种方法可以将 .SD+.SDcols 中的变量名与 data.table 中的非 .SD 变量名保持在一起?
【发布时间】:2022-01-08 22:44:23
【问题描述】:

给定一个data.table

library(data.table)
DT = data.table(x=rep(c("b","a","c"),each=3), v=c(1,1,1,2,2,1,1,2,2), y=c(1,3,6), a=1:9, b=9:1)
DT
   x v y a b
1: b 1 1 1 9
2: b 1 3 2 8
3: b 1 6 3 7
4: a 2 1 4 6
5: a 2 3 5 5
6: a 1 6 6 4
7: c 1 1 7 3
8: c 2 3 8 2
9: c 2 6 9 1

如果有的话

DT[, .(a, .SD), .SDcols=x:y]
   a .SD.x .SD.v .SD.y
1: 1     b     1     1
2: 2     b     1     3
3: 3     b     1     6
4: 4     a     2     1
5: 5     a     2     3
6: 6     a     1     6
7: 7     c     1     1
8: 8     c     2     3
9: 9     c     2     6

来自.SDcols 的变量以.SD 为前缀。另一方面,如果有人尝试,如https://stackoverflow.com/a/62282856/997979

DT[, c(.(a), .SD), .SDcols=x:y]
   V1 x v y
1:  1 b 1 1
2:  2 b 1 3
3:  3 b 1 6
4:  4 a 2 1
5:  5 a 2 3
6:  6 a 1 6
7:  7 c 1 1
8:  8 c 2 3
9:  9 c 2 6

其他变量名 (a) 丢失。 (正是由于这个原因,我重新提出了我最初标记为与上述链接重复的问题。

有什么方法可以同时保留.SD 变量和非.SD 变量的名称吗?

目标是同时能够使用.() 选择不带引号的变量,并能够通过.SDcols = patterns("...") 选择变量

提前致谢!

【问题讨论】:

标签: r data.table


【解决方案1】:

不太清楚为什么..但它有效;-)

DT[, .(a, (.SD)), .SDcols=x:y]
#    a x v y
# 1: 1 b 1 1
# 2: 2 b 1 3
# 3: 3 b 1 6
# 4: 4 a 2 1
# 5: 5 a 2 3
# 6: 6 a 1 6
# 7: 7 c 1 1
# 8: 8 c 2 3
# 9: 9 c 2 6

【讨论】:

  • 更正确的是使用列名称:DT[, c(.(a=a), .SD), .SDcols=x:y]。 .SD 是一个列表,因此应使用 c() 与新的列表元素“a”组合。
  • @jangorecki 感谢您的评论。我的问题是因为我在a 之外还有很多变量,所以我想知道如何避免将每个变量命名为c(.SD, .(a=a,a1=a1,a2=a2,a3=a3,...))。我看到DT[, .(a, as.vector(.SD)), .SDcols=x:y] 也可以使用,但使用as.vector 可能不会有什么改进,因为“大多数强制的细节都没有记录,并且可能会发生变化。”它实际上在 R-devel 上发生了变化。 (我刚刚读到:“'as.vector' 有一个 'data.frame' 方法现在返回一个简单的列表(也遵守长期存在的 'FIXME' 以启用 'as.vector(, mode ="列表")'。")
猜你喜欢
  • 1970-01-01
  • 2021-12-28
  • 2019-02-05
  • 2015-06-16
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多