【问题标题】:Shifting datatable rows by indices按索引移动数据表行
【发布时间】:2017-07-17 09:13:22
【问题描述】:

在尝试回答 this question on Stack Overflow 时,我遇到了自己的单独问题,我自己无法解决。但是,我真的很想为我的问题找到一个有效的解决方案。我最初将其发布为该问题的答案,但由于它引起了混乱,我认为单独发布此问题是一个更好的决定:

假设我有以下数据:

set.seed(1)
dat <- data.table(value = seq(1,7),value2 = seq(1,7))
shift_id = c(1,2,3,NA,4,NA,5)

我想使用 shift_id 将行移到两个新列中,因此所需的输出是:

   value value2 value1.shift value2.shift
1:     1      1            1            1
2:     2      2            2            2
3:     3      3            3            3
4:     4      4            NA            NA
5:     5      5            4            4
6:     6      6            NA            NA
7:     7      7            5            5

请注意,第 7 行包含第 5 行的内容,因为 shift_id[7]=5 我如何使用 DT 包有效地做到这一点?

非常感谢任何帮助!

【问题讨论】:

  • 这基本上是一个基本的 R 特征,即通过它的位置对向量进行子集化。看起来不像 data.table 相关的。
  • 确实如此,我只是想知道如何使用 DT 包做到这一点。感谢您对答案的反馈!

标签: r data.table


【解决方案1】:

你可以试试:

dat[, c("value1.shift", "value2.shift") := list(dat$value[shift_id], dat$value2[shift_id])]

 > dat
   value value2 value1.shift value2.shift
1:     1      1            1            1
2:     2      2            2            2
3:     3      3            3            3
4:     4      4           NA           NA
5:     5      5            4            4
6:     6      6           NA           NA
7:     7      7            5            5

另一种使用数据表特定功能的更通用方法(感谢@David Arenburg 的建议)是:

dat[, paste0(names(dat)[grepl("value", names(dat))], ".shift") := lapply(.SD, `[`, shift_id), .SDcols = grep("value", names(dat))]

【讨论】:

  • 你可能不需要dat$。并且可以使用lapply.SDpaste.SDcols 进行泛化。
  • 没错,我会在答案中添加它!谢谢你的建议。
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多