我有一个像这样的数据框:
set.seed(34)
startingframe <- data.frame(
group1=factor(rep(c("a","b"),each=3,times=1)),
time=rep(1:3,each=1,times=2),
othercolumn=rnorm(1:6)
)
...我正在尝试将其处理成一个列表,该列表按组和time
列的每个“迭代”进行拆分,结果如下所示:
$a1
group1 time othercolumn
1 a 1 -0.13889
$a2
group1 time othercolumn
1 a 1 -0.138890
2 a 2 1.199813
$a3
group1 time othercolumn
1 a 1 -0.1388900
2 a 2 1.1998129
3 a 3 -0.7477224
$b1
group1 time othercolumn
4 b 1 -0.5752482
$b2
group1 time othercolumn
4 b 1 -0.5752482
5 b 2 -0.2635815
$b3
group1 time othercolumn
4 b 1 -0.5752482
5 b 2 -0.2635815
6 b 3 -0.4554921
我想我只需要将迭代位合并到此代码中即可:
split_list <- split(startingframe,list(startingframe$group1,startingframe$time))
编辑:我可能已经简化了原始问题,但是实际数据集还有其他一些列需要在列表中传递。
答案 0 :(得分:1)
在此处不拆分,而是生成所需的输出。
genlist = function(l,t){return((data.frame(group1=rep(x = l,times=t),time=seq(from=1,to = t,by = 1))))}
mapply(genlist,startingframe$group1,startingframe$time,SIMPLIFY = FALSE)
答案 1 :(得分:1)
您可以对序列head
中的每个数字,数据的每个子组1:nrow(x)
使用x
out <- lapply(split(df, df$group1), function(x) lapply(1:nrow(x), head, x = x))
out <- unlist(out, recursive = F)
out
# $`a1`
# group1 time
# 1: a 1
#
# $a2
# group1 time
# 1: a 1
# 2: a 2
#
# $a3
# group1 time
# 1: a 1
# 2: a 2
# 3: a 3
#
# $b1
# group1 time
# 1: b 1
#
# $b2
# group1 time
# 1: b 1
# 2: b 2
#
# $b3
# group1 time
# 1: b 1
# 2: b 2
# 3: b 3
尽管您可能不需要创建所有这些数据框的列表,而只需创建索引列表并根据需要使用它们即可。
inds <-
lapply(split(seq(nrow(df)), df$group1), function(x)
lapply(1:length(x), function(y) x[seq(y)]))
inds
# $`a`
# $`a`[[1]]
# [1] 1
#
# $`a`[[2]]
# [1] 1 2
#
# $`a`[[3]]
# [1] 1 2 3
#
#
# $b
# $b[[1]]
# [1] 4
#
# $b[[2]]
# [1] 4 5
#
# $b[[3]]
# [1] 4 5 6
df[inds$b[[2]]]
# group1 time
# 1: b 1
# 2: b 2
答案 2 :(得分:0)
一种方法是在另一个lapply
内使用lapply
lapply(levels(startingframe$group1), function(group) {
df = startingframe[startingframe$group1 == group, ]
lapply(df$time, function(time) {
df[df$time %in% 1:time, ]
})
})
[[1]]
[[1]][[1]]
group1 time
1 a 1
[[1]][[2]]
group1 time
1 a 1
2 a 2
[[1]][[3]]
group1 time
1 a 1
2 a 2
3 a 3
[[2]]
[[2]][[1]]
group1 time
4 b 1
[[2]][[2]]
group1 time
4 b 1
5 b 2
[[2]][[3]]
group1 time
4 b 1
5 b 2
6 b 3