1

我有一个数据框:

plot1   data    plot2   data2    data3
 a       25       c       28      13
 b       46       e       18      12
 c       21       j       66      24
 d       32
 e       1

我想按如下方式获取我的数据:

plot1   data    plot2   data2     data3
 a       25        a      0        0
 b       46        b      0        0
 c       21        c      66       13
 d       32        d      0        0
 e       1         e      18       12
 j       0         j      66       24
4

1 回答 1

3

这是一个高度可扩展的选项,使用data.table

样本数据

library(data.table)
DT <- fread("plot1   data    plot2   data2    data3
 a       25       c       28      13
 b       46       e       18      12
 c       21       j       66      24
 d       32 NA NA NA 
 e       1 NA NA NA")
#    plot1 data plot2 data2 data3
# 1:     a   25     c    28    13
# 2:     b   46     e    18    12
# 3:     c   21     j    66    24
# 4:     d   32  <NA>    NA    NA
# 5:     e    1  <NA>    NA    NA

代码

# Split in parts of 2 columns
L <- lapply( split.default(DT, f = cumsum(grepl("^plot",names(DT))) ),
             function(x) setnames(x, old = grep("^plot", names(x), value = TRUE), new = "plot") )

mymerge <- function(x, y) merge.data.table(x, y, all = TRUE, by = "plot", allow.cartesian = TRUE)
ans <- Reduce(mymerge, L)[!is.na(plot), ]
ans[is.na(ans)] <- 0
ans

输出

#    plot data data2 data3
# 1:    a   25     0     0
# 2:    b   46     0     0
# 3:    c   21    28    13
# 4:    d   32     0     0
# 5:    e    1    18    12
# 6:    j    0    66    24
于 2021-06-21T13:48:13.210 回答