【问题标题】:R dplyr - error in subsetting of local data frameR dplyr - 本地数据帧的子集错误
【发布时间】:2015-08-22 07:10:57
【问题描述】:

作为更大、更复杂代码体的一部分,我遇到了 dplyr / 本地数据帧挑战。正如下面的简化示例所示,代码包括在基本 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 

这给出了想要的答案:

 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 生成的“本地数据帧”强制转换回常规数据帧?

【问题讨论】:

    标签: r dataframe subset dplyr


    【解决方案1】:

    一旦你对数据框进行分组,它就会变成一个tibble 对象。 tibble 的特性之一是,当您对它进行子集化时(例如 dat[2,"group"]),它总是返回 tibble。所以dat[,"group"]==dat[2,"group"] 正在比较整个 tibble/data.frame。不是你想要的。

    如果您在旧代码中有很多此类子设置并且您不想更改旧代码,请将 tibble 转换回数据框:dat=as.data.frame(dat)

    否则,Tatiana 的解决方案效果很好。

    【讨论】:

      【解决方案2】:

      这样做:

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

      【讨论】:

        猜你喜欢
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 2019-03-14
        相关资源
        最近更新 更多