r - 将数据从 R data.table 中的一行复制到新行

标签 r data.table copy row

我有一个如下表:

library(data.table)
dt <- data.table(t0.id=1:2,t0.V1=c("a","e"),t0.V2=c("b","f"),t1.id=3:4,t1.V1=c("c","g"),t1.V2=c("d","h"))

dt
   t0.id t0.V1 t0.V2 t1.id t1.V1 t1.V2
1:     1     a     b     3     c     d
2:     2     e     f     4     g     h

我想将数据从第一行复制到新行,如下所示:

   t0.id t0.V1 t0.V2 t1.id t1.V1 t1.V2
1:     1     a     b                  
2:                       3     c     d
3:     2     e     f     4     g     h

我知道如何复制该行(我见过 this post ),但我不知道如何按条件清除列(例如 t0.id==1),因为两行相等。

我想这可以通过行索引来完成,但我的真实表有数千行,我认为这不是最好的方法。

谢谢

编辑:

  • 行的最终顺序并不重要,即最终行 1 和 2 不需要彼此相邻。
  • 我“手动”(通过查看一些变量)确定需要拆分哪些行。因此,唯一适用的条件是基于“t0.id”。

最佳答案

library(data.table)
splitids <- 1L # t0.id
out <- rbindlist(list(
    dt[t0.id %in% splitids, .SD, .SDcols = patterns("^t0")],
    dt[t0.id %in% splitids, .SD, .SDcols = patterns("^t1")],
    dt[!t0.id %in% splitids,]),
  use.names = TRUE, fill = TRUE)
out
#    t0.id  t0.V1  t0.V2 t1.id  t1.V1  t1.V2
#    <int> <char> <char> <int> <char> <char>
# 1:     1      a      b    NA   <NA>   <NA>
# 2:    NA   <NA>   <NA>     3      c      d
# 3:     2      e      f     4      g      h

如果您逐一查看,可能会更有意义:

dt[t0.id %in% splitids, .SD, .SDcols = patterns("^t0")]
#    t0.id  t0.V1  t0.V2
#    <int> <char> <char>
# 1:     1      a      b
dt[t0.id %in% splitids, .SD, .SDcols = patterns("^t1")]
#    t1.id  t1.V1  t1.V2
#    <int> <char> <char>
# 1:     3      c      d
dt[!t0.id %in% splitids,]
#    t0.id  t0.V1  t0.V2 t1.id  t1.V1  t1.V2
#    <int> <char> <char> <int> <char> <char>
# 1:     2      e      f     4      g      h

如果您需要空白 "" 而不是 NA,那么可以对您的 character 列执行此操作,但不能对 code>t*.id 列,因为这会将它们从整数转换为字符

ischr <- which(sapply(dt, inherits, "character"))
ischr
# t0.V1 t0.V2 t1.V1 t1.V2 
#     2     3     5     6 
out[, (ischr) := lapply(.SD, fcoalesce, ""), .SDcols = ischr][]
#    t0.id  t0.V1  t0.V2 t1.id  t1.V1  t1.V2
#    <int> <char> <char> <int> <char> <char>
# 1:     1      a      b    NA              
# 2:    NA                   3      c      d
# 3:     2      e      f     4      g      h

关于r - 将数据从 R data.table 中的一行复制到新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69912306/

相关文章:

json - 提取、格式化和单独存储在数据框列中的 JSON

regex - 替代 for() 循环以将非常大的数据框列条目与非常大的向量列表进行比较

r - 是否可以从 PostgreSQL 读取 data.table ?

javascript - 在另一个对象中创建一个对象的副本。脚本语言

r - 计算具有负二项式响应的 GLM 的交叉验证

c++ - 将 R 的种子从 Rcpp 更改为保证可重复性

r - 将两个函数应用于同一列的不同值

通过给定列索引替换数据表中的值

iPhone 通过代码将某些内容复制到剪贴板

mysql - 如何将索引从一个相同的表复制到另一个现有的相同表