如何根据值根据跨行的列之间的条件对数据框进行子集化
How to subset dataframe based on conditions between columns across rows depending on values
我有一个数据框,其中包含有关个人 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'))
按 'period'、'work_place' 分组,创建具有不同 'id' 数量的列 'n',然后按 'id'、filter
那些 'id' 具有 'n' 的 all
个元素作为 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
一个data.table
选项(遵循的相同想法)
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
我有一个数据框,其中包含有关个人 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'))
按 'period'、'work_place' 分组,创建具有不同 'id' 数量的列 'n',然后按 'id'、filter
那些 'id' 具有 'n' 的 all
个元素作为 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
一个data.table
选项(遵循
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