首页 > 解决方案 > R:想要将数据表中的列中的数据复制到特定的行中

问题描述

我目前有多个数据表,如下所示:

第一四分位数

Q1DT = data.table(
  Tree = c("Cherry", "Birch", "Oak"), 
  Height = c("1m", "3m", "5m"), 
  Age = c(10L, 12L, 15L)
)
Q1DT
#      Tree Height Age
# 1: Cherry     1m  10
# 2:  Birch     3m  12
# 3:    Oak     5m  15

意思是

AVGDT = data.table(
  Tree = c("Cherry", "Birch", "Oak"), 
  Height = c("2m", "5m", "7m"), 
  Age = c(13L, 17L, 19L)
)
AVGDT
#      Tree Height Age
# 1: Cherry     1m  10
# 2:  Birch     3m  12
# 3:    Oak     5m  15

四分位数 3

Q3DT = data.table(
  Tree = c("Cherry", "Birch", "Oak"), 
  Height = c("7m", "10m", "25m"), 
  Age = c(17L, 22L, 25L)
)
Q3DT
#      Tree Height Age
# 1: Cherry     1m  10
# 2:  Birch     3m  12
# 3:    Oak     5m  15

我想将它们组合起来,使它们看起来像这样:

    Tree     Measure  Q1  Q2  Q3
    Cherry   Height    
    Cherry   Age
    Birch    Height
    Birch    Age
    Oak      Height
    Oak      Age  

我使用以下内容制作了表格的基本内容:

output.complete <- data.table(Tree= rep(trees.quartile.1$Tree, each = 2), measure = c(rep(c("Height", "Age"), times = length(unique(trees.quartile.1$Tree)))))

但是,我现在无法从单独的四分位数数据表中的数据中计算出如何填充此表。任何帮助将不胜感激!

标签: rdata.table

解决方案


有几种方法可以做到这一点。我将使用rbindmeltdcast重塑您的数据:

stack = rbind(Q1 = Q1DT, AVG = AVGDT, Q3 = Q3DT, idcol = 'stat')

# this will give a warning -- in the input, 'Age' is
#   an integer, and 'Height' is a character, so melt
#   must force 'Age' to be a character to proceed
out = stack[ , melt(.SD, id.vars = c('stat', 'Tree'), variable.name = 'Measure')
             ][ , dcast(.SD, Tree + Measure ~ stat, value.var = 'value')]
#      Tree Measure AVG Q1  Q3
# 1:  Birch  Height  5m 3m 10m
# 2:  Birch     Age  17 12  22
# 3: Cherry  Height  2m 1m  7m
# 4: Cherry     Age  13 10  17
# 5:    Oak  Height  7m 5m 25m
# 6:    Oak     Age  19 15  25

我们可以在setcolorder之后使用以获取所需顺序的列,或者以正确的顺序定义stat为一个因素stack

stack[ , stat := factor(stat, levels = c('Q1', 'AVG', 'Q3'))]

推荐阅读