我有一个大型数据框,我希望将其分成不同的(较小的)数据帧,这些数据帧包含两个不同列中任意一列的元素。假设我有一个如下所示的数据框:
v1 v2 v3 v4 v5
mom dad 2 4 5
bro mom 5 3 4
sis dad 3 4 2
bro sis 3 7 9
我想将其拆分为4个独立的数据框,每个数据框对应v1或v2中的每个唯一值。新数据框应如下所示:
$mom
v1 v2 v3 v4 v5
mom dad 2 4 5
bro mom 5 3 4
$dad
v1 v2 v3 v4 v5
mom dad 2 4 5
sis dad 3 4 2
$sis
v1 v2 v3 v4 v5
sis dad 3 4 2
bro sis 3 7 9
$bro
bro mom 5 3 4
bro sis 3 7 9
我能够使用for循环执行此操作,但我希望结束输出是一个列表,以便在每个元素上轻松执行函数。我使用的for循环看起来像这样:
for(i in 1:length(us)){
subset.dataframe <-dataframe[dataframe$v1 == us[i] | dataframe$v2 == us[i],]
}
其中“us”是两个(v1和v2)列组合的唯一值的向量。
提前感谢您提供的任何帮助。
答案 0 :(得分:2)
您可以使用lapply
循环遍历us
并对原始数据框进行子集化,这将返回数据帧列表。假设df
是您的数据框:
us = unique(c(df$v1, df$v2))
setNames(lapply(us, function(e) subset(df, v1 == e | v2 == e)), us)
$mom
v1 v2 v3 v4 v5
1 mom dad 2 4 5
2 bro mom 5 3 4
$bro
v1 v2 v3 v4 v5
2 bro mom 5 3 4
4 bro sis 3 7 9
$sis
v1 v2 v3 v4 v5
3 sis dad 3 4 2
4 bro sis 3 7 9
$dad
v1 v2 v3 v4 v5
1 mom dad 2 4 5
3 sis dad 3 4 2
答案 1 :(得分:1)
我们也可以通过循环unique
前两列的unlist
值,然后使用which
和arr.ind = TRUE
来获取行索引并对行进行子集化'df1'
Un1 <- unique(unlist(df1[1:2]))
setNames(lapply(Un1, function(nm) df1[which(nm == df1[1:2],
arr.ind = TRUE)[,1],]), Un1)
#$mom
# v1 v2 v3 v4 v5
#1 mom dad 2 4 5
#2 bro mom 5 3 4
#$bro
# v1 v2 v3 v4 v5
#2 bro mom 5 3 4
#4 bro sis 3 7 9
#$sis
# v1 v2 v3 v4 v5
#3 sis dad 3 4 2
#4 bro sis 3 7 9
#$dad
# v1 v2 v3 v4 v5
#1 mom dad 2 4 5
#3 sis dad 3 4 2