【发布时间】:2014-09-04 21:46:16
【问题描述】:
我有一个这样的数据框:
period x y db perc
1 2013-08-26 4 166 nh 2.409639
2 2013-09-02 5 222 nh 2.252252
3 2013-09-09 3 223 nh 1.345291
4 2013-09-16 9 198 nh 4.545455
5 2013-09-23 3 213 nh 1.408451
6 2013-09-30 5 226 nh 2.212389
...
每个 db 有许多观察值。我希望制作数据帧的一个子集,不包括该 db == 0 的 x 值总和的任何行,并导出一个逻辑向量 removal_candidates,如下所示:
xsums <- by(drawdata$x, drawdata$db, sum)
removal_candidates <- xsums == 0
...
ne nf nh ni nj nl nm nn no np nq nr nu
FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
在这个例子中,我想制作一个没有 nf 行的 drawdata 副本,但是像 drawdata[drawdata$db == removal_candidates] 这样的幼稚尝试不起作用。
--
按照以下 mso 的回答使用工作解决方案进行编辑:
xsums <- by(drawdata$x, drawdata$db, sum)
keep_candidates <- xsums > 0
inc <- names(keep_candidates)[keep_candidates == TRUE]
drawdata <- drawdata[drawdata$db %in% inc,]
drawdata$db <- factor(drawdata$db) # needed to remove 'nf' from 'levels(drawdata$db)'
根据以下@jazzurro 的回答使用工作解决方案进行编辑:
library(dplyr)
xs <- drawdata %>% group_by(db) %>% summarise(xsum = sum(x))
removals <- xs$db[xs$xsum == 0]
drawdata <- filter(drawdata, !db %in% removals)
drawdata$db <- factor(drawdata$db)
作为一个 R 新手,xs 是一个数据框这一事实使得 @jazzurro 的方法非常容易使用。
--
详细阅读dplyr introduction 后的进一步版本,并参考dplyr window functions 文档:
libary(dplyr)
filter(
mutate(
group_by(drawdata, db)
, sx = sum(x)
)
, sx > 0)
或像这样“锁链”
group_by(drawdata, db) %>% # make a grouping (not visible)
mutate(sx = sum(x)) %>% # add a column based on the grouping
filter(sx > 0) # filter by new column
这是很棒的东西。
【问题讨论】:
-
数字向量的总和不太可能是
==0。 (该事件的概率测量实际上不是 0,但它很接近。)也许您应该发布一个测试用例,其中一个或多个类别将为您的测试提供真实值? -
@rorycl:这些答案对你有帮助吗?您的反馈将不胜感激。
-
@BondedDust:是的,有一些总和 == 0