使用 data.frames 列表中的特定行创建 data.frames 列表
Create list of data.frames with specific rows from list of data.frames
我有一些 data.frames 存储在列表 (list1) 中,我想用 data.frames 创建一个新列表 (list2),其中第一个包含 data.frames 在 list1 中,second 包含所有第二行等。这是一个示例:
set.seed(42)
df1 <- data.frame(a=sample.int(100,3),b=sample.int(100,3))
df2 <- data.frame(a=sample.int(100,3),b=sample.int(100,3))
list1 <- list(df1,df2)
list1
[[1]]
a b
1 92 84
2 93 64
3 29 51
[[2]]
a b
1 74 71
2 14 46
3 65 100
据此,我想创建如下列表 2:
[[1]]
a b
1 92 84
2 74 71
[[2]]
a b
1 93 64
2 14 46
[[3]]
a b
1 29 51
2 65 100
在 R
中执行此操作的有效方法是什么?
如果所有的行数都相同
nr <- nrow(list1[[1]])
lapply(seq_len(nr), function(i) do.call(rbind, lapply(list1, function(x) x[i,])))
另一种选择是将其绑定到单个 data.frame,按组创建序列,split
将处理 lists
行数不等的情况
library(dplyr)
library(data.table)
bind_rows(list1, .id = 'grp') %>%
mutate(rn = rowid(grp)) %>%
{split(.[c('a', 'b')], .$rn)}
假设所有数据帧的行数和列数相同,则以下工作:
split(do.call(rbind, lapply(list1, function(x) x)),
rep(1:nrow(list1[[1]]), length(list1)))
# $`1`
# a b
# 1 92 84
# 2 74 71
#
# $`2`
# a b
# 1 93 64
# 2 14 46
#
# $`3`
# a b
# 1 29 51
# 2 65 100
d = lapply(list1, asplit, 1)
Map(rbind, d[[1]], d[[2]])
我有一些 data.frames 存储在列表 (list1) 中,我想用 data.frames 创建一个新列表 (list2),其中第一个包含 data.frames 在 list1 中,second 包含所有第二行等。这是一个示例:
set.seed(42)
df1 <- data.frame(a=sample.int(100,3),b=sample.int(100,3))
df2 <- data.frame(a=sample.int(100,3),b=sample.int(100,3))
list1 <- list(df1,df2)
list1
[[1]]
a b
1 92 84
2 93 64
3 29 51
[[2]]
a b
1 74 71
2 14 46
3 65 100
据此,我想创建如下列表 2:
[[1]]
a b
1 92 84
2 74 71
[[2]]
a b
1 93 64
2 14 46
[[3]]
a b
1 29 51
2 65 100
在 R
中执行此操作的有效方法是什么?
如果所有的行数都相同
nr <- nrow(list1[[1]])
lapply(seq_len(nr), function(i) do.call(rbind, lapply(list1, function(x) x[i,])))
另一种选择是将其绑定到单个 data.frame,按组创建序列,split
将处理 lists
行数不等的情况
library(dplyr)
library(data.table)
bind_rows(list1, .id = 'grp') %>%
mutate(rn = rowid(grp)) %>%
{split(.[c('a', 'b')], .$rn)}
假设所有数据帧的行数和列数相同,则以下工作:
split(do.call(rbind, lapply(list1, function(x) x)),
rep(1:nrow(list1[[1]]), length(list1)))
# $`1`
# a b
# 1 92 84
# 2 74 71
#
# $`2`
# a b
# 1 93 64
# 2 14 46
#
# $`3`
# a b
# 1 29 51
# 2 65 100
d = lapply(list1, asplit, 1)
Map(rbind, d[[1]], d[[2]])