Как создать фрейм данных и задать имена из асимметричного списка - PullRequest
1 голос
/ 05 мая 2020

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

list(var1 = list(h1 = c(10.9611796797792, 21.3462734400736, 20.7853261733763, 
15.6824858411484, 10.8334816495598), h2 = c(4.80589839889621, 
12.3105625617661, 15.7670780786755, 15.1455762008278, 12.9320644396137
), h3 = c(2.97965199377172, 8.34945004958277, 11.6982312491857, 
12.3228106551495, 11.5665805697996)), var2 = list(h1 = c(1.09611796797792, 
3.23074531198528, 5.30927792932291, 6.87752651343775, 7.96087467839373
), h2 = c(0.480589839889622, 1.71164609606623, 3.28835390393377, 
4.80291152401656, 6.09611796797792), h3 = c(0.297965199377172, 
1.13291020433545, 2.30273332925402, 3.53501439476897, 4.69167245174893
)), date = structure(c(17897, 17928, 17956, 17987, 18017), class = "Date"))

Я хочу объединить его во фрейм данных, который выглядит следующим образом:

# A tibble: 5 x 7
  var1_a1 var1_a2 var1_a3 var2_a1 var2_a2 var2_a3 date      
    <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl> <date>    
1    11.0    4.81    2.98    1.10   0.481   0.298 2019-01-01
2    21.3   12.3     8.35    3.23   1.71    1.13  2019-02-01
3    20.8   15.8    11.7     5.31   3.29    2.30  2019-03-01
4    15.7   15.1    12.3     6.88   4.80    3.54  2019-04-01
5    10.8   12.9    11.6     7.96   6.10    4.69  2019-05-01

Итак, столбец numeri c имена будут следовать шаблону vari_aj с заранее заданным размером i и j. Как я могу это сделать? Решение Base R предпочтительнее, но tidyverse тоже подойдет

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Пусть dat будет вашим списком примеров. Думаю, работает следующее.

dat <- data.frame(dat)
names(dat) <- sub('\\.h', '_a', names(dat))
dat
#    var1_a1   var1_a2   var1_a3  var2_a1   var2_a2   var2_a3       date
# 1 10.96118  4.805898  2.979652 1.096118 0.4805898 0.2979652 2019-01-01
# 2 21.34627 12.310563  8.349450 3.230745 1.7116461 1.1329102 2019-02-01
# 3 20.78533 15.767078 11.698231 5.309278 3.2883539 2.3027333 2019-03-01
# 4 15.68249 15.145576 12.322811 6.877527 4.8029115 3.5350144 2019-04-01
# 5 10.83348 12.932064 11.566581 7.960875 6.0961180 4.6916725 2019-05-01
0 голосов
/ 05 мая 2020

Я бы попробовал

df <- data.frame()
for (i in 1:2) {
  vari <- paste0("var",i)
  for (j in 1:3) {
    varj <- paste0("h",j)
    print(li[[vari]][[varj]]  )
    df <- cbind(df, li[[vari]][[varj]])
  }
}
...