我正在尝试开发一个函数,该函数从用户提供的列向量和每列内的值列表中创建data frame
子集列表。
示例数据框:
df <- data.frame(var1 = rep(1:3, each = 5),
var2 = rep(4:6, each = 5),
var3 = rep(7:9, each = 5))
列到子集的向量:
cols.df <- c(1,2,3)
每列中的值列表,按子集分列:rows.df <- list(c(1:3), c(4:6), c(7:9))
迭代创建子集列表的函数:
subsetfcn <- function(data, cols, rowslist){
df <- data
listofdfs <- list() # create data.frame to contain subsets
for(a in cols){
for(rows in rowslist) {
for(row in rows) {
df <- df[df[ , a]==row, ]
listofdfs[[row]] <- df
}
}
}
return(listofdfs)
}
results <- subsetfcn(df, cols.df, rows.df)
预期输出是以下列表:
> df[df[ , 1]==1, ]
var1 var2 var3
1 1 4 7
2 1 4 7
3 1 4 7
4 1 4 7
5 1 4 7
> df[df[ , 1]==2, ]
var1 var2 var3
6 2 5 8
7 2 5 8
8 2 5 8
9 2 5 8
10 2 5 8
> df[df[ , 1]==3, ]
var1 var2 var3
11 3 6 9
12 3 6 9
13 3 6 9
14 3 6 9
15 3 6 9
>
> df[df[ , 2]==4, ]
var1 var2 var3
1 1 4 7
2 1 4 7
3 1 4 7
4 1 4 7
5 1 4 7
> df[df[ , 2]==5, ]
var1 var2 var3
6 2 5 8
7 2 5 8
8 2 5 8
9 2 5 8
10 2 5 8
> df[df[ , 2]==6, ]
var1 var2 var3
11 3 6 9
12 3 6 9
13 3 6 9
14 3 6 9
15 3 6 9
等...
截至目前,该函数返回9个数据框的列表,但每个数据框都没有行。我不确定为什么没有将正确的值传递给a
和row
。
答案 0 :(得分:2)
使用 mapply :
res <- unlist(
mapply(function(cols.df, rows.df){
lapply(rows.df, function(x){ df[ df[ , cols.df ] == x, ] })
}, cols.df, rows.df, SIMPLIFY = FALSE),
recursive = FALSE)
# check output
length(res)
# [1] 9
res[1:2]
# [[1]]
# var1 var2 var3
# 1 1 4 7
# 2 1 4 7
# 3 1 4 7
# 4 1 4 7
# 5 1 4 7
#
# [[2]]
# var1 var2 var3
# 6 2 5 8
# 7 2 5 8
# 8 2 5 8
# 9 2 5 8
# 10 2 5 8