2015-06-07 68 views
2

作爲更大更復雜的代碼體的一部分,我遇到了dplyr/local數據框挑戰。按照下面示出了簡化的示例中,代碼包括在基礎R作品子集的一個基本類型:R dplyr - 本地數據框的子集化錯誤

#creation of data frame 
dat=data.frame(group=c(rep(c("a","b","c","d"),2)),value=(seq(1,8,1))) 
othergroup=dat[dat[,"group"]==dat[2,"group"],] 
othergroup 

此得到所需的答案:

group value 
2  b  2 
6  b  6 

#loading dplyr 
require(dplyr)    
othergroup=dat[dat[,"group"]==dat[2,"group"],] 
othergroup #still works 

剛剛加載dplyr後,所有仍然有效。但是,在運行dplyr操作之後,會創建一個不再允許類似子集的本地數據框。

#pro-forma dplyr operation 
dat = dat %>% 
    group_by(group) 

othergroup=dat[dat[,"group"]==dat[2,"group"],] #error message 

Error in Ops.data.frame(dat[, "group"], dat[2, "group"]) : 
‘==’ only defined for equally-sized data frames 

據我所知,可以使用dplyr中的select函數,但我想重新使用一些現有的代碼。有沒有辦法將dplyr生成的「本地數據框」強制回到常規數據框中?

回答

0

只是這樣做:

othergroup = dat[dat$group == dat$group[2],] 
0

一旦你組的數據幀就成了tibble對象。 tibble的其中一項功能是當您將其子集(例如dat[2,"group"])時,它總是會返回tibble。所以dat[,"group"]==dat[2,"group"]是比較整個tibble/data.frame。不是你想要的。

如果您在舊代碼中有很多這種子設置,並且您不想更改舊代碼,請將該Tibble轉換回數據框:dat=as.data.frame(dat)

否則,塔蒂亞娜的解決方案效果很好。