简体   繁体   中英

R dplyr - error in subsetting of local data frame

As part of a larger and more complex body of code, I am running into a dplyr / local data frame challenge. As the simplified example per below shows, the code includes a basic type of subsetting that works in base R:

#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 

This gives the desired answer:

 group value
2     b     2
6     b     6

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

After just loading dplyr, all still works. However, after I run a dplyr operation, then a local data frame is created that no longer allows similar subsetting.

#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

I understand that one can use the select function in dplyr, but I would like to re-use some existing code. Is there a way to coerce a dplyr generated "local data frame" back into a regular data frame?

只要这样做:

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

Once you group the data frame it becomes a tibble object. One of the features of a tibble is that when you subset it (eg dat[2,"group"] ), it always returns a tibble . So dat[,"group"]==dat[2,"group"] is comparing the whole tibble/data.frame. Not what you want.

If you have lots of this kind of sub-setting in old code and you don't want to change your old code, convert the tibble back to a data frame: dat=as.data.frame(dat) .

Otherwise, Tatiana's solution works well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM