将数据帧分为两个因素

Eth*_* D. 4 split r 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
Run Code Online (Sandbox Code Playgroud)

基本上,我想基于列B和列C创建两个新的数据框架。在之前的文章中,我已经看到了如何基于我确实做过的一个因素使用“拆分”来对数据进行子集化

test <- split(sampdata, sampdata$B)
str(test)
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。但是,当我尝试添加第二个拆分时:

testBC <- split(test, test$C)
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

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

我也尝试过:

testBC <- split(test$B, test$C)
Run Code Online (Sandbox Code Playgroud)

但是又收到一条错误消息。因此,然后我尝试了基于ddplyplyr包的第二种方法:

test2 <- ddply(sampdata, c("B", "C"))
Run Code Online (Sandbox Code Playgroud)

这确实按行组织了数据,使得:

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
Run Code Online (Sandbox Code Playgroud)

但是,其他线程仅显示如何基于一个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
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,不胜感激。

akr*_*run 7

如果我们需要按多列拆分,请将其放在 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
Run Code Online (Sandbox Code Playgroud)