【问题标题】:How do you split a dataframe according to an element contained in one of two different columns?如何根据包含在两个不同列之一中的元素拆分数据框?
【发布时间】:2016-12-14 22:16:13
【问题描述】:

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

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

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

【问题讨论】:

  • 来自过于复杂的代码部门 - c( split(df, pmax(df$v1, df$v2)), split(df, pmin(df$v1, df$v2)) )

标签: r list split subset


【解决方案1】:

您可以只使用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

【讨论】:

  • 我最终使用了这种方法。我真的很喜欢这种简单。谢谢你的信息。
  • 请问function(e)是做什么的? 'e' 只是虚拟变量吗?
  • function(e) subset(df, v1 == e | v2 == e) 这是 R 中的匿名函数。e 是函数参数。当我们使用lapply循环us时,e会从us中一一取值。
【解决方案2】:

我们也可以通过循环遍历unlisted 的前两列的unique 值,然后使用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

【讨论】:

    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2021-01-24
    • 2021-10-04
    • 2021-11-20
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多