如何根据值根据行之间的列之间的条件对数据框进行子集化

时间:2021-04-14 17:39:37

标签: r subset

我有一个数据框,其中包含有关个人 ID、时间段和工作地点代码的信息。我想知道在数据集的整个时间跨度内独自工作的人是谁。

考虑下面这个非常简单的例子。个人 A 在时期 1 中单独在两个工作地点 (x,y) 工作。个人 B 和 C 在时期 1 中在工作地点 z 一起工作。个人 B 在时期 2 中单独在工作地点 w 工作。个人 D 在地点 k 单独工作在第 2 期。

mydf <- data.frame(id=c('A','A','B','C','B','D'),
                   period=c(1,1,1,1,2,2),
                   work_place=c('x','y','z','z','w','k'))

我想确定与在整个时期内单独工作的人有关的行,在本例中是指个人 A 和 D。

ids_alone <- data.frame(id=c('A','A','D'),
                        period=c(1,1,2),
                        work_place=c('x','y','k'))

2 个答案:

答案 0 :(得分:2)

按'期间'、'work_place'分组,创建一列'n',其中包含不同'id'的数量,然后按'id'分组,filter那些'id'具有all个元素'n' 为 1

library(dplyr)
mydf %>%
  group_by(period, work_place) %>% 
  mutate(n = n_distinct(id)) %>%
  group_by(id) %>% 
  filter(all(n ==1)) %>%
  ungroup %>%
  select(-n)

-输出

# A tibble: 3 x 3
#  id    period work_place
#  <chr>  <dbl> <chr>     
#1 A          1 x         
#2 A          1 y         
#3 D          2 k         

答案 1 :(得分:2)

data.table 选项(遵循 @akrun 的相同想法)

setDT(mydf)[
  ,
  n := uniqueN(id),
  .(period, work_place)
][
  ,
  .SD[mean(n) == 1], id
][
  ,
  n := NULL
][]

给出

   id period work_place
1:  A      1          x
2:  A      1          y
3:  D      2          k
相关问题