我有一个示例数据集,如下所示:
df <- data.frame(Group = c("a", "d", "a", "b", "b", "c", "c", "c", "c"),
Year = c("1991", '1992', '1993', '1991', '1992', '1991', '1992','1993','1994'),
value = 1:9)
我想选择与1991具有相同组的行。例如,组在1991年为a,b,c;这些组是1992年的d,b,c;因此,在1992年选择了b和c组。1993年是a和c组;因此,在1993年只选择了a和c。结果输出为
Group Year
a 1991
b 1991
c 1991
b 1992
c 1992
a 1993
c 1993
这是我尝试的:
df2 <- df %>% group_by(Group, Year) %>%
mutate(total = n()) %>%
filter(total == 3)
我可以将total == 3更改为total == 2,但是无论如何,它会过滤观测值,以便每年都有相同的组,而我只希望基于1991年进行选择。
答案 0 :(得分:2)
这里是dplyr
的一种方式-
df %>%
arrange(Year, Group) %>% # not necessary but nice to have I think
filter(Group %in% Group[Year == 1991])
Group Year value
1 a 1991 1
2 b 1991 4
3 c 1991 6
4 b 1992 5
5 c 1992 7
6 a 1993 3
7 c 1993 8
8 c 1994 9
答案 1 :(得分:0)
仅df[df$Group %in% df$Group[df$Year == 1991],]
,您就完成了:)
答案 2 :(得分:0)
我尚不清楚您想要的输出是什么,但我更喜欢一个数据框列表,以后可以将其附加在一起。
N.B。这可能超出了您的需要,因为其他答案只是根据Year
列的子集中的值过滤行。 1
library(data.table)
lapply(split.data.frame(df, df$Year),
function(x) na.omit(setDT(x)[setDT(df[df$Year=='1991',]), ,
on=.(Group)]))
# $`1991`
# Group Year value i.Year i.value
# 1: a 1991 1 1991 1
# 2: b 1991 4 1991 4
# 3: c 1991 6 1991 6
#
# $`1992`
# Group Year value i.Year i.value
# 1: b 1992 5 1991 4
# 2: c 1992 7 1991 6
#
# $`1993`
# Group Year value i.Year i.value
# 1: a 1993 3 1991 1
# 2: c 1993 8 1991 6
#
# $`1994`
# Group Year value i.Year i.value
# 1: c 1994 9 1991 6