按两个因素拆分数据框

时间:2017-10-07 04:53:11

标签: r split subset

我有一个数据框(sampdata),如下所示:

A B  C   D
1 X  5 0.3
2 Y 10 0.9
3 Y  7 0.2
4 Y  5 0.4
5 X 10 0.7

基本上,我想基于B列和C列创建两个新的数据框。在早期的帖子中,我已经看到了如何使用' split'基于我做过的一个因素

test <- split(sampdata, sampdata$B)
str(test)

到目前为止一切顺利。但是,当我尝试添加第二个分割时:

testBC <- split(test, test$C)

我收到了错误消息:

  

split.default(test,test $ Product)出错:     组长度为0但数据长度> 0。 0

我也尝试过:

testBC <- split(test$B, test$C)

但又收到了另一条错误消息。那么,我尝试了第二种方法,基于ddplyplyr包:

test2 <- ddply(sampdata, c("B", "C"))

这确实按行组织数据:

A B  C   D
1 X  5 0.3
5 X 10 0.7 
2 Y 10 0.9
3 Y  7 0.2
4 Y  5 0.4

但是,其他线程仅显示如何基于一个col(test2$B)而不是两者来访问特定数据帧。我宁愿简单地基于B和C的子集生成新的数据帧,以便:

newdf1
A B C   D
1 X 5  .3
5 X 10 .9

newdf2
A B C   D
2 Y 7  .2
3 Y 5  .4
4 Y 10  .7

在尝试了几种方法之后,简单而简单的任务很可能是非常困难的(至少对我而言)。

最值得赞赏的任何帮助。

2 个答案:

答案 0 :(得分:5)

如果我们需要按多列拆分,请将其放在list

split(df1, list(df1$B, df1$C), drop = TRUE)
#$X.5
#  A B C   D
#1 1 X 5 0.3

#$Y.5
#  A B C   D
#4 4 Y 5 0.4

#$Y.7
#  A B C   D
#3 3 Y 7 0.2

#$X.10
#  A B  C   D
#5 5 X 10 0.7

#$Y.10
#  A B  C   D
#2 2 Y 10 0.9

答案 1 :(得分:0)

所以我尝试了上面的建议,谢谢你,但是,我无法让它与我的真实&#39;数据。

这就是我做的事情

test10<-sampdata
test10$C<-10
test10$B<-"X"
test.10.X<-test10

这给了我一个单独的数据框,只有基于cols B和C的X和10相关的值。然后我将不得不为col,B和C的每个X,Y和10,5,7的组合重复

我不擅长编写循环,但也许我可以编写某种循环,所以我不是复制并粘贴相同的代码而只是更改值?

无论如何,这适用于我的目的。

非常欢迎有关改进代码的建议。

谢谢!