引用在.sdcols中的参考列使用用于循环

发布于 2025-01-24 15:40:13 字数 781 浏览 0 评论 0原文

因此,我正在尝试实现的目标是:说我有一个数据表DT,上面有4列。我想获得2列组合的独特长度。

DT <- data.table(a = 1:10, b = c(1,1,1,2,2,3,4,4,5,5), c = letters[1:10], d = c(3,3,5,2,4,2,5,1,1,5))

> DT
    a b c d
1:  1 1 a 3
2:  2 1 b 3
3:  3 1 c 5
4:  4 2 d 2
5:  5 2 e 4
6:  6 3 f 2
7:  7 4 g 5
8:  8 4 h 1
9:  9 5 i 1
10: 10 5 j 5

我尝试了以下代码:

cols <- colnames(DT)
for(i in 1:(length(cols)-1)) {
for (j in i+1:length(cols)) {
    print(unique(DT[,.SD, .SDcols = c(cols[i],cols[j])]))
     }   
   }

在这里,基本上“我”从第一列到第二列,而“ j”是与'i'的组合列。因此,我得到的组合是:AB,AC,AD,BC,BD,CD。

但这给了我以下错误

中的错误[。data.table(dt,,.sd,.sdcols = c(cols [i],cols [j])): .sdcols在以下索引上缺少:[2]

如果有人可以解释为什么这样做,并且可以解决它,我将非常感谢。谢谢。

So what I'm trying to achieve is this : Say I have a data table dt having (say) 4 columns. I want to get unique length of every combination of 2 columns.

DT <- data.table(a = 1:10, b = c(1,1,1,2,2,3,4,4,5,5), c = letters[1:10], d = c(3,3,5,2,4,2,5,1,1,5))

> DT
    a b c d
1:  1 1 a 3
2:  2 1 b 3
3:  3 1 c 5
4:  4 2 d 2
5:  5 2 e 4
6:  6 3 f 2
7:  7 4 g 5
8:  8 4 h 1
9:  9 5 i 1
10: 10 5 j 5

I tried the following code :

cols <- colnames(DT)
for(i in 1:(length(cols)-1)) {
for (j in i+1:length(cols)) {
    print(unique(DT[,.SD, .SDcols = c(cols[i],cols[j])]))
     }   
   }

Here, basically 'i' goes from first column to second last whereas 'j' is the combining column with 'i'. So the combinations I get are : ab, ac, ad, bc, bd, cd.

But it gives me the following error

Error in [.data.table(DT, , .SD, .SDcols = c(cols[i], cols[j])) :
.SDcols missing at the following indices: [2]

If someone can explain why this is and a way around it, I'll be really grateful. Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

懵少女 2025-01-31 15:40:13

这是由于操作员优先 ,:在+之前评估:

1+1:length(cols)
[1] 2 3 4 5
> (1+1):length(cols)
[1] 2 3 4

正确的循环是:

for(i in 1:(length(cols)-1)) {
  for (j in (i+1):length(cols)) {
    print(unique(DT[,.SD, .SDcols = c(cols[i],cols[j])]))
  }   
}

This is due to operators precedence, : is evaluated before +:

1+1:length(cols)
[1] 2 3 4 5
> (1+1):length(cols)
[1] 2 3 4

Correct loop is :

for(i in 1:(length(cols)-1)) {
  for (j in (i+1):length(cols)) {
    print(unique(DT[,.SD, .SDcols = c(cols[i],cols[j])]))
  }   
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文