如何根据两个不同列之一中包含的元素拆分数据框?

时间:2016-08-09 02:18:46

标签: r list split subset

我有一个大型数据框,我希望将其分成不同的(较小的)数据帧,这些数据帧包含两个不同列中任意一列的元素。假设我有一个如下所示的数据框:

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)列组合的唯一值的向量。

提前感谢您提供的任何帮助。

2 个答案:

答案 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值,然后使用whicharr.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