我想仅保留具有3个或更多INSTANCES的ID的观察结果。或者,另一方面,删除ID少于3个INSTANCES的观察结果。样本数据:
Instances <- data.frame(ID=c(111111, 111111, 111111, 111111,
222222, 222222,
333333, 333333, 333333),
INSTANCE=c(1,2,3,4,1,2,1,2,3),
AMOUNT=c(100,120,108,112, 60, 65, 85, 90, 101))
Instances$ID <- as.factor(Instances$ID)
Instances$INSTANCE <- as.factor(Instances$INSTANCE)
从这个样本中,我希望从ID 111111和333333返回所有观察结果,但不会从222222返回。
我确信我可以通过ID创建magrittr中的管道功能。 当我尝试这个时,我无法保持INSTANCE&gt;的功能。 3绑定ID。我仍然理解%&gt;%并仍在阅读它,但与此同时,任何帮助和潜在的解释,为什么/如何工作将不胜感激。保持温暖的人们。
答案 0 :(得分:3)
基础解决方案
a_x <- ave(Instances$INSTANCE,
Instances$ID,
FUN = max)
Instances[a_x >= 3,]
ID INSTANCE AMOUNT
1 111111 1 100
2 111111 2 120
3 111111 3 108
4 111111 4 112
7 333333 1 85
8 333333 2 90
9 333333 3 101
使用dplyr:
library(dplyr)
Instances %>%
group_by(ID) %>%
mutate(max_instance = max(INSTANCE)) %>%
filter(max_instance >= 3) %>%
select(-max_instance)
ID INSTANCE AMOUNT
1 111111 1 100
2 111111 2 120
3 111111 3 108
4 111111 4 112
7 333333 1 85
8 333333 2 90
9 333333 3 101
ID
或INSTANCE
转换为因子)Instances <- data.frame(ID=c(111111, 111111, 111111, 111111,
222222, 222222,
333333, 333333, 333333),
INSTANCE=c(1,2,3,4,1,2,1,2,3),
AMOUNT=c(100,120,108,112, 60, 65, 85, 90, 101))
答案 1 :(得分:2)
正如我之前的评论中所述,无论您的Instances$INSTANCE
数据结构如何,这都应该有效。我使用ave
并创建一个1的向量来总结:
Instances[ave(rep(1, nrow(Instances)), Instances$ID, FUN = length) >= 3,]
# ID INSTANCE AMOUNT
#1 111111 1 100
#2 111111 2 120
#3 111111 3 108
#4 111111 4 112
#7 333333 1 85
#8 333333 2 90
#9 333333 3 101
答案 2 :(得分:1)
这使用dplyr :: n()函数计算每个ID,将其命名为'size'并返回size> gt; 2:
library(dplyr)
Instances %>% group_by(ID) %>% mutate(size=n()) %>% filter(size>2)
# A tibble: 7 x 4
# Groups: ID [2]
ID INSTANCE AMOUNT size
<fctr> <fctr> <dbl> <int>
1 111111 1 100 4
2 111111 2 120 4
3 111111 3 108 4
4 111111 4 112 4
5 333333 1 85 3
6 333333 2 90 3
7 333333 3 101 3
如果我一直在使用ave
,我会尝试:ave(Instances$ID, Instances$ID, FUN=length)