我有一个数据框(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)
但又收到了另一条错误消息。那么,我尝试了第二种方法,基于ddply
和plyr
包:
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
在尝试了几种方法之后,简单而简单的任务很可能是非常困难的(至少对我而言)。
最值得赞赏的任何帮助。
答案 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的组合重复
我不擅长编写循环,但也许我可以编写某种循环,所以我不是复制并粘贴相同的代码而只是更改值?
无论如何,这适用于我的目的。
非常欢迎有关改进代码的建议。
谢谢!