我有一个名为mylist
的嵌套列表,其长度为4。
此列表的每个元素都是一个实验:exp1.1
,exp1.2
,exp2.1
和exp2.2
。
每个实验都包含四个植物生长阶段的长度(以天为单位)的观察结果:EM-V6
V6-R0
R0-R4
和R4-R9
。
每个增长阶段都被组织为一个包含year
和mean
的数据框。
以下是完整的数据:
mylist=structure(list(exp1.1 = structure(list(`EM-V6` = structure(list(
year = 2011:2100, mean = c(34, 34, 32, 28, 25, 32, 32, 28,
27, 30, 32, 31, 33, 28, 26, 31, 33, 27, 34, 26, 28, 27, 27,
30, 29, 31, 34, 30, 26, 31, 33, 33, 27, 30, 28, 32, 31, 29,
32, 31, 25, 28, 28, 26, 32, 29, 26, 31, 28, 29, 30, 25, 27,
32, 27, 28, 28, 30, 24, 30, 29, 29, 29, 28, 26, 28, 26, 26,
28, 31, 30, 27, 26, 28, 25, 24, 24, 30, 27, 26, 26, 27, 26,
26, 24, 26, 28, 25, 30, 26)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `V6-R0` = structure(list(year = 2011:2100,
mean = c(30, 33, 33, 32, 29, 30, 32, 31, 32, 30, 33, 30,
32, 33, 33, 32, 29, 31, 32, 28, 31, 29, 36, 29, 30, 30, 33,
31, 33, 30, 34, 32, 29, 31, 28, 30, 30, 29, 34, 31, 32, 31,
30, 28, 32, 29, 29, 32, 29, 28, 29, 29, 32, 31, 27, 32, 29,
31, 29, 29, 30, 29, 29, 29, 28, 28, 30, 30, 30, 32, 29, 29,
30, 29, 29, 29, 28, 28, 29, 30, 29, 29, 29, 30, 28, 30, 30,
29, 29, 29)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `R0-R4` = structure(list(year = 2011:2100,
mean = c(31, 32, 32, 33, 32, 32, 33, 31, 34, 32, 33, 33,
32, 31, 33, 31, 32, 32, 32, 30, 32, 31, 34, 30, 31, 32, 34,
33, 34, 32, 36, 33, 32, 32, 31, 30, 32, 32, 32, 32, 32, 32,
31, 30, 30, 31, 32, 32, 30, 30, 32, 31, 31, 32, 30, 32, 29,
32, 31, 30, 32, 30, 30, 31, 32, 30, 31, 30, 31, 32, 31, 31,
30, 30, 30, 31, 30, 30, 31, 30, 31, 30, 30, 30, 31, 32, 30,
31, 30, 30)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `R4-R9` = structure(list(year = 2011:2100,
mean = c(27, 29, 28, 28, 27, 30, 29, 27, 30, 26, 30, 28,
29, 28, 29, 27, 29, 28, 25, 26, 26, 25, 27, 27, 27, 28, 30,
28, 29, 27, 29, 28, 29, 28, 26, 26, 28, 28, 30, 28, 27, 25,
26, 25, 25, 26, 26, 27, 25, 25, 26, 25, 27, 28, 24, 27, 25,
28, 26, 24, 27, 26, 27, 25, 26, 26, 24, 26, 25, 26, 24, 25,
25, 26, 26, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 26, 26,
26, 25, 24)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame")), .Names = c("EM-V6", "V6-R0", "R0-R4",
"R4-R9")), exp1.2 = structure(list(`EM-V6` = structure(list(year = 2011:2100,
mean = c(34, 34, 32, 28, 25, 32, 32, 28, 27, 30, 32, 31,
33, 28, 26, 31, 33, 27, 34, 26, 28, 27, 27, 30, 29, 31, 34,
30, 26, 31, 33, 33, 27, 30, 28, 32, 31, 29, 32, 31, 25, 28,
28, 26, 32, 29, 26, 31, 28, 29, 30, 25, 27, 32, 27, 28, 28,
30, 24, 30, 29, 29, 29, 28, 26, 28, 26, 26, 28, 31, 30, 27,
26, 28, 25, 24, 24, 30, 27, 26, 26, 27, 26, 26, 24, 26, 28,
25, 30, 26)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `V6-R0` = structure(list(year = 2011:2100,
mean = c(30, 33, 33, 32, 29, 30, 32, 31, 32, 30, 33, 30,
32, 33, 33, 32, 29, 31, 32, 28, 31, 29, 36, 29, 30, 30, 33,
31, 33, 30, 34, 32, 29, 31, 28, 30, 30, 29, 34, 31, 32, 31,
30, 28, 32, 29, 29, 32, 29, 28, 29, 29, 32, 31, 27, 32, 29,
31, 29, 29, 30, 29, 29, 29, 28, 28, 30, 30, 30, 32, 29, 29,
30, 29, 29, 29, 28, 28, 29, 30, 29, 29, 29, 30, 28, 30, 30,
29, 29, 29)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `R0-R4` = structure(list(year = 2011:2100,
mean = c(31, 32, 32, 33, 32, 32, 33, 31, 34, 32, 33, 33,
32, 31, 33, 31, 32, 32, 32, 30, 32, 31, 34, 30, 31, 32, 34,
33, 34, 32, 36, 33, 32, 32, 31, 30, 32, 32, 32, 32, 32, 32,
31, 30, 30, 31, 32, 32, 30, 30, 32, 31, 31, 32, 30, 32, 29,
32, 31, 30, 32, 30, 30, 31, 32, 30, 31, 30, 31, 32, 31, 31,
30, 30, 30, 31, 30, 30, 31, 30, 31, 30, 30, 30, 31, 32, 30,
31, 30, 30)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `R4-R9` = structure(list(year = 2011:2100,
mean = c(27, 29, 28, 28, 27, 30, 29, 27, 30, 26, 30, 28,
29, 28, 29, 27, 29, 28, 25, 26, 26, 25, 27, 27, 27, 28, 30,
28, 29, 27, 29, 28, 29, 28, 26, 26, 28, 28, 30, 28, 27, 25,
26, 25, 25, 26, 26, 27, 25, 25, 26, 25, 27, 28, 24, 27, 25,
28, 26, 24, 27, 26, 27, 25, 26, 26, 24, 26, 25, 26, 24, 25,
25, 26, 26, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 26, 26,
26, 25, 24)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame")), .Names = c("EM-V6", "V6-R0", "R0-R4",
"R4-R9")), exp2.1 = structure(list(`EM-V6` = structure(list(year = 2011:2100,
mean = c(34, 34, 32, 28, 25, 32, 32, 28, 27, 30, 32, 31,
33, 28, 26, 31, 33, 27, 34, 26, 28, 27, 27, 30, 29, 31, 34,
30, 26, 31, 33, 33, 27, 30, 28, 32, 31, 29, 32, 31, 25, 28,
28, 26, 32, 29, 26, 31, 28, 29, 30, 25, 27, 32, 27, 28, 28,
30, 24, 30, 29, 29, 29, 28, 26, 28, 26, 26, 28, 31, 30, 27,
26, 28, 25, 24, 24, 30, 27, 26, 26, 27, 26, 26, 24, 26, 28,
25, 30, 26)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `V6-R0` = structure(list(year = 2011:2100,
mean = c(30, 33, 33, 32, 29, 30, 32, 31, 32, 30, 33, 30,
32, 33, 33, 32, 29, 31, 32, 28, 31, 29, 36, 29, 30, 30, 33,
31, 33, 30, 34, 32, 29, 31, 28, 30, 30, 29, 34, 31, 32, 31,
30, 28, 32, 29, 29, 32, 29, 28, 29, 29, 32, 31, 27, 32, 29,
31, 29, 29, 30, 29, 29, 29, 28, 28, 30, 30, 30, 32, 29, 29,
30, 29, 29, 29, 28, 28, 29, 30, 29, 29, 29, 30, 28, 30, 30,
29, 29, 29)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `R0-R4` = structure(list(year = 2011:2100,
mean = c(31, 32, 32, 33, 32, 32, 33, 31, 34, 32, 33, 33,
32, 31, 33, 31, 32, 32, 32, 30, 32, 31, 34, 30, 31, 32, 34,
33, 34, 32, 36, 33, 32, 32, 31, 30, 32, 32, 32, 32, 32, 32,
31, 30, 30, 31, 32, 32, 30, 30, 32, 31, 31, 32, 30, 32, 29,
32, 31, 30, 32, 30, 30, 31, 32, 30, 31, 30, 31, 32, 31, 31,
30, 30, 30, 31, 30, 30, 31, 30, 31, 30, 30, 30, 31, 32, 30,
31, 30, 30)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `R4-R9` = structure(list(year = 2011:2100,
mean = c(27, 29, 28, 28, 27, 30, 29, 27, 30, 26, 30, 28,
29, 28, 29, 27, 29, 28, 25, 26, 26, 25, 27, 27, 27, 28, 30,
28, 29, 27, 29, 28, 29, 28, 26, 26, 28, 28, 30, 28, 27, 25,
26, 25, 25, 26, 26, 27, 25, 25, 26, 25, 27, 28, 24, 27, 25,
28, 26, 24, 27, 26, 27, 25, 26, 26, 24, 26, 25, 26, 24, 25,
25, 26, 26, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 26, 26,
26, 25, 24)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame")), .Names = c("EM-V6", "V6-R0", "R0-R4",
"R4-R9")), exp2.2 = structure(list(`EM-V6` = structure(list(year = 2011:2100,
mean = c(34, 34, 32, 28, 25, 32, 32, 28, 27, 30, 32, 31,
33, 28, 26, 31, 33, 27, 34, 26, 28, 27, 27, 30, 29, 31, 34,
30, 26, 31, 33, 33, 27, 30, 28, 32, 31, 29, 32, 31, 25, 28,
28, 26, 32, 29, 26, 31, 28, 29, 30, 25, 27, 32, 27, 28, 28,
30, 24, 30, 29, 29, 29, 28, 26, 28, 26, 26, 28, 31, 30, 27,
26, 28, 25, 24, 24, 30, 27, 26, 26, 27, 26, 26, 24, 26, 28,
25, 30, 26)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `V6-R0` = structure(list(year = 2011:2100,
mean = c(30, 33, 33, 32, 29, 30, 32, 31, 32, 30, 33, 30,
32, 33, 33, 32, 29, 31, 32, 28, 31, 29, 36, 29, 30, 30, 33,
31, 33, 30, 34, 32, 29, 31, 28, 30, 30, 29, 34, 31, 32, 31,
30, 28, 32, 29, 29, 32, 29, 28, 29, 29, 32, 31, 27, 32, 29,
31, 29, 29, 30, 29, 29, 29, 28, 28, 30, 30, 30, 32, 29, 29,
30, 29, 29, 29, 28, 28, 29, 30, 29, 29, 29, 30, 28, 30, 30,
29, 29, 29)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `R0-R4` = structure(list(year = 2011:2100,
mean = c(31, 32, 32, 33, 32, 32, 33, 31, 34, 32, 33, 33,
32, 31, 33, 31, 32, 32, 32, 30, 32, 31, 34, 30, 31, 32, 34,
33, 34, 32, 36, 33, 32, 32, 31, 30, 32, 32, 32, 32, 32, 32,
31, 30, 30, 31, 32, 32, 30, 30, 32, 31, 31, 32, 30, 32, 29,
32, 31, 30, 32, 30, 30, 31, 32, 30, 31, 30, 31, 32, 31, 31,
30, 30, 30, 31, 30, 30, 31, 30, 31, 30, 30, 30, 31, 32, 30,
31, 30, 30)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame"), `R4-R9` = structure(list(year = 2011:2100,
mean = c(27, 29, 28, 28, 27, 30, 29, 27, 30, 26, 30, 28,
29, 28, 29, 27, 29, 28, 25, 26, 26, 25, 27, 27, 27, 28, 30,
28, 29, 27, 29, 28, 29, 28, 26, 26, 28, 28, 30, 28, 27, 25,
26, 25, 25, 26, 26, 27, 25, 25, 26, 25, 27, 28, 24, 27, 25,
28, 26, 24, 27, 26, 27, 25, 26, 26, 24, 26, 25, 26, 24, 25,
25, 26, 26, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 26, 26,
26, 25, 24)), .Names = c("year", "mean"), row.names = c(NA,
-90L), class = "data.frame")), .Names = c("EM-V6", "V6-R0", "R0-R4",
"R4-R9"))), .Names = c("exp1.1", "exp1.2", "exp2.1", "exp2.2"
))
我需要做的是将这个嵌套列表“取消列表”到一个如下所示的数据框:
YEAR EXP EM-V6 V6-R0 R0-R4 R4-R9
2011 exp1.1 34 30 31 27
2011 exp1.2 34 30 31 27
2011 exp2.1 34 30 31 27
2011 exp1.1 34 30 31 27
这意味着:
- first year, first experiment, and growth stages.
- first year, second experiment and growth stages.
- first year, third experiment and growth stages
- first year, fourth experiment and growth stages
- second year, first experiment and growth stages
等等。
如何执行数据转换?
答案 0 :(得分:7)
使用rbindlist
的{{1}} - 套餐两次的替代方案:
data.table
或者一气呵成:
library(data.table)
# bind the dataframes in the 'listed lists' together and include the year with the 'id'-parameter
# the resulting 'data.table's are returned as a list
step1 <- lapply(mylist, rbindlist, id = 'stages')
# bind the resulting list together and include the experiment id
step2 <- rbindlist(step1, id = 'experiment')
# reshape to wide format
dcast(step2, year + experiment ~ stages, value.var = 'mean')
给出:
dcast(rbindlist(lapply(mylist, rbindlist, id = 'stages'), id = 'experiment'),
year + experiment ~ stages, value.var = 'mean')
答案 1 :(得分:6)
Alternate tidyverse:
library(tidyverse)
map_df(mylist, ~bind_rows(., .id="id"), .id="EXP") %>%
spread(id, mean)
答案 2 :(得分:1)
我们可以将tidyverse
用于更紧凑和可读的代码
library(dplyr)
library(tidyr)
library(purrr)
res1 <- mylist %>%
#bind the inner datasets and create an id column
map(bind_rows, .id = "id") %>%
#bind the outer datasets and create an EXP column
bind_rows(.id = "EXP") %>%
#reshape to wide format
spread(id, mean)
head(res1, 4)
# EXP year EM-V6 R0-R4 R4-R9 V6-R0
#1 exp1.1 2011 34 31 27 30
#2 exp1.1 2012 34 32 29 33
#3 exp1.1 2013 32 32 28 33
#4 exp1.1 2014 28 33 28 32
或者我们可以通过使用mylist
循环lapply
来处理此问题,然后通过Map
cbind
创建一个新列“name”names
内部list
元素,然后rbind
list
元素与do.call(rbind
,现在做第二个Map
根据{{names
创建一个新列1}}'mylist',rbind
list
元素,然后来自reshape
的{{1}}将其转换为'wide'
base R
注意:未使用外部包(100%res <- do.call(rbind, Map(cbind, lapply(mylist, function(x)
do.call(rbind, Map(cbind, x, name = names(x)))), EXP= names(mylist)))
res2 <- reshape(res, idvar = c("year", "EXP"),
timevar = "name", direction = "wide")
row.names(res2) <- NULL
head(res2, 4)
# year EXP mean.EM-V6 mean.V6-R0 mean.R0-R4 mean.R4-R9
#1 2011 exp1.1 34 30 31 27
#2 2012 exp1.1 34 33 32 29
#3 2013 exp1.1 32 33 32 28
#4 2014 exp1.1 28 32 33 28
)
或使用base R
中的dcast
转换为'广泛'格式
reshape2