R: хотите скопировать данные из столбцов в таблице данных в определенные c строк - PullRequest
0 голосов
/ 05 мая 2020

В настоящее время у меня есть несколько таблиц данных, которые выглядят следующим образом:

Первый квартиль

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)))))

Однако я не могу работать Узнайте, как заполнить эту таблицу сейчас из данных в таблицах данных отдельных квартилей. Любая помощь будет принята с благодарностью!

1 Ответ

2 голосов
/ 05 мая 2020

Есть несколько способов сделать это. Я собираюсь использовать rbind, melt и dcast, чтобы изменить форму ваших данных:

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'))]
...