R 列表到数据框,映射_df正在移动行
我的数据输出是一个包含参与者数据嵌套列表的列表R 列表到数据框,映射_df正在移动行,r,list,purrr,mapply,R,List,Purrr,Mapply,我的数据输出是一个包含参与者数据嵌套列表的列表 例如,一个列表将包含参与者1到参与者5 在该列表中,参与者1将有2天的数据,参与者2可能有5天的数据(嵌套列表),等等 当我使用map_df组合这些列表时,它会像这样移动行: xtest = map_df(DF, ~as.data.frame(.x), .null = NA) # which comes out like this structure(list(X0.601705399641698 = c(0.60170539964169
- 例如,一个列表将包含参与者1到参与者5
- 在该列表中,参与者1将有2天的数据,参与者2可能有5天的数据(嵌套列表),等等
xtest = map_df(DF, ~as.data.frame(.x), .null = NA)
# which comes out like this
structure(list(X0.601705399641698 = c(0.601705399641698, NA,
NA, NA, NA), X1.0967226417789 = c(NA, 1.0967226417789, NA, NA,
NA), X1.18794820947846 = c(NA, 1.18794820947846, NA, NA, NA),
X3.98557480186904 = c(NA, 3.98557480186904, NA, NA, NA),
X0.995996328131446 = c(NA, NA, 0.995996328131446, NA, NA),
X0.564513260465204 = c(NA, NA, 0.564513260465204, NA, NA),
X1.31356753668681 = c(NA, NA, 1.31356753668681, NA, NA),
X0.891872221784271 = c(NA, NA, 0.891872221784271, NA, NA),
X0.649008813684839 = c(NA, NA, NA, 0.649008813684839, NA),
X1.0036615512612 = c(NA, NA, NA, 1.0036615512612, NA), NA_real_. = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_), X0.828273303379322 = c(NA,
NA, NA, NA, 0.828273303379322)), row.names = c(NA, -5L), class = "data.frame")
X0.601705399641698 X1.0967226417789 X1.18794820947846 X3.98557480186904 X0.995996328131446 X0.564513260465204 X1.31356753668681 X0.891872221784271
1 0.6017054 NA NA NA NA NA NA NA
2 NA 1.096723 1.187948 3.985575 NA NA NA NA
3 NA NA NA NA 0.9959963 0.5645133 1.313568 0.8918722
4 NA NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA NA
X0.649008813684839 X1.0036615512612 NA_real_. X0.828273303379322
1 NA NA NA NA
2 NA NA NA NA
3 NA NA NA NA
4 0.6490088 1.003662 NA NA
5 NA NA NA 0.8282733
它似乎是按列添加数据,并移动新值,而不是从参与者2的第1列第2行开始,依此类推
是否有办法将map_df数据帧输出更改为从第1列开始,但保留与每个参与者对应的行
预期产出:
1 2 3 4
1 0.6017054 NA NA NA # participant 1
2 1.096723 1.187948 3.985575 NA # participant 2
3 0.9959963 0.5645133 1.313568 0.8918722 # participant 3
4 0.6490088 1.003662 NA NA # Participant 4
5 0.8282733 NA NA NA # Participant 5
一种
tidyverse
方法
library(tidyverse)
map_dfr(DF, ~unlist(.x) %>% t() %>% as.data.frame())
# V1 V2 V3 V4
#1 0.6017054 NA NA NA
#2 1.0967226 1.1879482 3.985575 NA
#3 0.9959963 0.5645133 1.313568 0.8918722
#4 0.6490088 1.0036616 NA NA
#5 0.8282733 NA NA NA
或者使用data.table
library(data.table)
rbindlist(lapply(DF, function(x) data.table(t(unlist(x)))), fill = TRUE)
# V1 V2 V3 V4
#1: 0.6017054 NA NA NA
#2: 1.0967226 1.1879482 3.985575 NA
#3: 0.9959963 0.5645133 1.313568 0.8918722
#4: 0.6490088 1.0036616 NA NA
#5: 0.8282733 NA NA NA
请包括您的预期输出,即您想要的输出,而不仅仅是您不想要的输出。抱歉,已更新。您的示例数据
列表
不包含任何名称。最后的列名“Clm1”
,“Clm2”
,“Clm3”
,“Clm4”
来自哪里?在tidyverse
中,从无名称的列表中重塑条目通常会导致一些警告/错误。实际数据列表中的元素是否有名称?原始列表输出的名称为[[1]],依此类推。map_df函数似乎只是根据列表中的值命名列。最后的列名“Clm1”等,在这一刻并不重要,这只是我试图澄清。它们可以是1,2,3,4作为默认值,或者没有列的名称,我可以稍后重命名它们。[[1]]
等等告诉您元素未命名。这适用于我发布的5个参与者的子集数据;然而,当我尝试在100个参与者列表上应用这两种方法时,我得到一个错误:t.default中的错误(unlist(x)):参数不是矩阵。更新:我在列表应该存在的位置发现了一个空值,通过将其设置为0进行修复。
library(data.table)
rbindlist(lapply(DF, function(x) data.table(t(unlist(x)))), fill = TRUE)
# V1 V2 V3 V4
#1: 0.6017054 NA NA NA
#2: 1.0967226 1.1879482 3.985575 NA
#3: 0.9959963 0.5645133 1.313568 0.8918722
#4: 0.6490088 1.0036616 NA NA
#5: 0.8282733 NA NA NA