从另一个变量函数

时间:2018-01-04 17:55:33

标签: r

我想仅保留具有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;%并仍在阅读它,但与此同时,任何帮助和潜在的解释,为什么/如何工作将不胜感激。保持温暖的人们。

3 个答案:

答案 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

数据(注意我没有将IDINSTANCE转换为因子)

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)