【发布时间】:2018-11-21 22:06:53
【问题描述】:
我正在尝试开发一个函数,该函数从用户提供的列向量和每列中的值列表创建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。
【问题讨论】:
-
预期输出是什么?
-
@zx8754 我已经更新了问题以包含预期的输出。
-
@RTrain3k 我不太明白输出。您是否尝试根据列或列索引的值进行子集化?预期的输出似乎是前者。
-
也许是这个?
lapply(df, function(i) split(df, i)) -
@Gautam 我经常需要根据某些列的值创建许多数据框子集。在上面的示例中,我需要创建 9 个数据框的函数。一个用于第一列的每个值,一个用于第二列的每个值,一个用于第三列的每个值。如果我明确地这样做,代码将是:
df[df[ , 1]==1, ] df[df[ , 1]==2, ] df[df[ , 1]==3, ] df[df[ , 2]==4, ] df[df[ , 2]==5, ] df[df[ , 2]==6, ] df[df[ , 3]==7, ] df[df[ , 3]==8, ] df[df[ , 3]==9, ]