Очень часто я хочу преобразовать список, в котором каждый индекс имеет одинаковые типы элементов для фрейма данных. Например, у меня может быть список:
> my.list
[[1]]
[[1]]$global_stdev_ppb
[1] 24267673
[[1]]$range
[1] 0.03114799
[[1]]$tok
[1] "hello"
[[1]]$global_freq_ppb
[1] 211592.6
[[2]]
[[2]]$global_stdev_ppb
[1] 11561448
[[2]]$range
[1] 0.08870838
[[2]]$tok
[1] "world"
[[2]]$global_freq_ppb
[1] 1002043
Я хочу преобразовать этот список в кадр данных, где каждый индексный элемент является столбцом. Естественной (для меня) вещью является использование do.call
:
> my.matrix<-do.call("rbind", my.list)
> my.matrix
global_stdev_ppb range tok global_freq_ppb
[1,] 24267673 0.03114799 "hello" 211592.6
[2,] 11561448 0.08870838 "world" 1002043
Достаточно просто, но когда я пытаюсь использовать эту матрицу в качестве фрейма данных, столбцы остаются элементами списка, а не векторами:
> my.df<-as.data.frame(my.matrix, stringsAsFactors=FALSE)
> my.df[,1]
[[1]]
[1] 24267673
[[2]]
[1] 11561448
В настоящее время, чтобы правильно настроить кадр данных, я выполняю итерацию по каждому столбцу с помощью unlist
и as.vector
, а затем восстанавливая кадр данных как таковой:
new.list<-lapply(1:ncol(my.matrix), function(x) as.vector(unlist(my.matrix[,x])))
my.df<-as.data.frame(do.call(cbind, new.list), stringsAsFactors=FALSE)
Это, однако, кажется очень неэффективным. Есть ли лучший способ сделать это?