Преобразование каждой ячейки в столбце данных, содержащем список, в строку в кадре данных - PullRequest
0 голосов
/ 07 сентября 2018

В последнее время я довольно много работал с R, но у меня почти нет опыта работы со списками. Так что теперь, когда у меня есть списки, я не знаю, что делать. У меня есть датафрейм df, созданный с помощью следующей функции

df <- data.table(df)[, .(nm = names(.SD),fits = lapply(.SD, function(x) if(is.numeric(x)) summary(lm(y ~ x, na.action=na.omit)))), .SDcols = -1]

Он состоит из столбца с именами переменных и столбца со списком со сводной статистикой для этого имени переменной, например:

  nm  fits
1 A   list(call = lm(formula = y ~ x, na.action=na.omit))
2 B   list(call = lm(formula = y ~ x, na.action=na.omit))
3 C   list(call = lm(formula = y ~ x, na.action=na.omit))
4 D   list(call = lm(formula = y ~ x, na.action=na.omit))

Применяя:

dfoutput <- lapply(df$fits, function(x) x$coefficients[c(2),])

Я получаю следующий пример вывода для каждой переменной:

       Estimate Std. Error t value Pr(>|t|)    
x      -8.72283    0.68552  -12.72   <2e-16

Я хотел бы преобразовать каждый список в dfoutput в строку в кадре данных, принимая во внимание имя переменной nm и предпочтительно используя столбцы: Estimate Std. Error t value Pr(>|t|)), что дает мне следующий пример вывода :

Varname Estimate Std. Error t value Pr(>|t|) 
A       -8.72283    0.68552  -12.72   <2e-16
B       -0.72283    0.38552  -12.72   <2e-16
C       -2.72283    0.28552  -12.72   <2e-16
D       -1.72283    1.68552  -12.72   <2e-16

Кто-нибудь будет так любезен, чтобы помочь мне с этим?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Использование пакета plyr: просто замените формулу на ldply

library(plyr)
ldply(df$fits,function(x) x$coefficients[c(2),])

Выход:

  Estimate Std. Error   t value     Pr(>|t|)
1 -0.2233611 0.15508093 -1.440287 1.518983e-01
2  0.4089223 0.01889134 21.646019 1.038667e-47
3  0.8885803 0.05137355 17.296454 2.325498e-37
0 голосов
/ 07 сентября 2018

Мы можем использовать tidyverse

library(tidyverse)
map_df(lst1, as.list) 
# A tibble: 3 x 4
#  Estimate `Std. Error` `t value` `Pr(>|t|)`
#     <dbl>        <dbl>     <dbl>      <dbl>
#1   -0.223       0.155      -1.44   1.52e- 1
#2    0.409       0.0189     21.6    1.04e-47
#3    0.889       0.0514     17.3    2.33e-37

если нам нужен также столбец «nm», назовите «lst1» для этого столбца и используйте .id

set_names(lst1, LETTERS[1:3]) %>% 
         map_df(as.list, .id = 'Varname')
# A tibble: 3 x 5
#  Varname Estimate `Std. Error` `t value` `Pr(>|t|)`
#  <chr>      <dbl>        <dbl>     <dbl>      <dbl>
#1 A         -0.223       0.155      -1.44   1.52e- 1
#2 B          0.409       0.0189     21.6    1.04e-47
#3 C          0.889       0.0514     17.3    2.33e-37
0 голосов
/ 07 сентября 2018

Я верю, что вы просто хотите do.call(rbind, x)

См. Результат с данными, построенными ниже:

do.call(rbind, dfoutput)
#        Estimate Std. Error   t value     Pr(>|t|)
# [1,] -0.2233611 0.15508093 -1.440287 1.518983e-01
# [2,]  0.4089223 0.01889134 21.646019 1.038667e-47
# [3,]  0.8885803 0.05137355 17.296454 2.325498e-37

cbind(df, do.call(rbind, dfoutput))
#              nm         fits   Estimate Std. Error   t value     Pr(>|t|)
# 1:  Sepal.Width <summary.lm> -0.2233611 0.15508093 -1.440287 1.518983e-01
# 2: Petal.Length <summary.lm>  0.4089223 0.01889134 21.646019 1.038667e-47
# 3:  Petal.Width <summary.lm>  0.8885803 0.05137355 17.296454 2.325498e-37

Данные

library(data.table)
y <- iris$Sepal.Length
df0 <- iris[-5]
df <- data.table(df0)[, .(nm = names(.SD),fits = lapply(.SD, function(x) if(is.numeric(x)) summary(lm(y ~ x, na.action=na.omit)))), .SDcols = -1]
# nm         fits
# 1:  Sepal.Width <summary.lm>
# 2: Petal.Length <summary.lm>
# 3:  Petal.Width <summary.lm>

dfoutput <- lapply(df$fits, function(x) x$coefficients[c(2),])
dfoutput
# [[1]]
# Estimate Std. Error    t value   Pr(>|t|) 
# -0.2233611  0.1550809 -1.4402871  0.1518983 
# 
# [[2]]
# Estimate   Std. Error      t value     Pr(>|t|) 
# 4.089223e-01 1.889134e-02 2.164602e+01 1.038667e-47 
# 
# [[3]]
# Estimate   Std. Error      t value     Pr(>|t|) 
# 8.885803e-01 5.137355e-02 1.729645e+01 2.325498e-37 
...