【问题标题】:Replicating rows in data.table by column value按列值复制 data.table 中的行
【发布时间】:2015-05-01 22:13:02
【问题描述】:

我有一个结构如下的数据集:

data <- data.table(ID=1:10,Tenure=c(2,3,4,2,1,1,3,4,5,2),Var=rnorm(10))

    ID Tenure         Var
 1:  1      2 -0.72892371
 2:  2      3 -1.73534591
 3:  3      4  0.47007030
 4:  4      2  1.33173044
 5:  5      1 -0.07900914
 6:  6      1  0.63493316
 7:  7      3 -0.62710577
 8:  8      4 -1.69238758
 9:  9      5 -0.85709328
10: 10      2  0.10716830

我需要复制每一行 N=Tenure 次。例如我需要复制第一行 2 次(因为 Tenure = 2.

我需要转换后的数据集如下所示:

setkey(data,ID)
print(data[,.(ID=rep(ID,Tenure))][data][, Indx := 1:.N, by=ID])

   ID Tenure        Var Indx
1:  1      2 -0.7289237    1
2:  1      2 -0.7289237    2
3:  2      3 -1.7353459    1
4:  2      3 -1.7353459    2
5:  2      3 -1.7353459    3
6:  3      4  0.4700703    1
...
...

有没有更有效的方式(更data.table 方式)来做到这一点?我的方式很慢。我在想应该有一种方法可以使用by-without-by merge usng .EACHI

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我认为在这里使用键/合并没有帮助。只需通过传递行索引向量来扩展:

    DT <- data[rep(1:.N,Tenure)][,Indx:=1:.N,by=ID]
    

    【讨论】:

    • 如此简单!非常感谢!
    【解决方案2】:

    你可以试试:

    library(splitstackshape)
    expandRows(data, "Tenure", drop = FALSE)[,Indx:=1:.N,by=ID][]
    

    或者

    library(dplyr)
    library(splitstackshape)
    expandRows(data, "Tenure", drop = FALSE) %>% 
      group_by(ID) %>%
      mutate(Indx = row_number(Tenure))
    

    这给出了:

        ID Tenure        Var Indx
     1:  1      2 -0.8808717    1
     2:  1      2 -0.8808717    2
     3:  2      3  0.5962590    1
     4:  2      3  0.5962590    2
     5:  2      3  0.5962590    3
     6:  3      4  0.1197176    1
     7:  3      4  0.1197176    2
     8:  3      4  0.1197176    3
     9:  3      4  0.1197176    4
    10:  4      2 -0.2821739    1
    

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      相关资源
      最近更新 更多