首页 > 解决方案 > R - 过滤多年来保持不变的观察结果

问题描述

我准备了一个示例data.table:

testTable <- data.table(years = rep(c(rep((2014),3),rep((2015),3), rep((2016),3)), 2), 
                        policy = c(rep("A", 9), rep("B",9)),
                        destination = rep(c("Paris", "London", "Berlin"), 6))

testTable[c(1,5,8), destination := c("Moskaw", "Milano", "Valencia")]

> testTable
    years policy destination
 1:  2014      A      Moskaw
 2:  2014      A      London
 3:  2014      A      Berlin
 4:  2015      A       Paris
 5:  2015      A      Milano
 6:  2015      A      Berlin
 7:  2016      A       Paris
 8:  2016      A    Valencia
 9:  2016      A      Berlin
10:  2014      B       Paris
11:  2014      B      London
12:  2014      B      Berlin
13:  2015      B       Paris
14:  2015      B      London
15:  2015      B      Berlin
16:  2016      B       Paris
17:  2016      B      London
18:  2016      B      Berlin

在这里,我只想在destination数据中保留所有年份相同的观察结果。在这个例子中,我只选择了 3 年的政策,但真实数据也可能有 2,3 和 4 年的历史混合在一个 data.table 中。

期望的结果是:

> testTable
    years policy destination
 3:  2014      A      Berlin
 6:  2015      A      Berlin
 9:  2016      A      Berlin
10:  2014      B       Paris
11:  2014      B      London
12:  2014      B      Berlin
13:  2015      B       Paris
14:  2015      B      London
15:  2015      B      Berlin
16:  2016      B       Paris
17:  2016      B      London
18:  2016      B      Berlin

Any ides?

我尝试使用dcast(),然后我想过滤那些在之后的所有列中具有相同条目的行policy,但是我意识到这会dcast()自动将我的字符变量destination转换为数字并使用长度聚合我的数据:

Aggregate function missing, defaulting to 'length'

注意:我的数据将有数百个观察结果。

标签: rdata.tablecharacterlagdcast

解决方案


我们可以为 each过滤destination出现在 each中的那些 common 。yearspolicy

library(data.table)

testTable[testTable[, destination %in% 
                      Reduce(intersect, split(destination, years)), policy]$V1]


#    years policy destination
# 1:  2014      A      Berlin
# 2:  2015      A      Berlin
# 3:  2016      A      Berlin
# 4:  2014      B       Paris
# 5:  2014      B      London
# 6:  2014      B      Berlin
# 7:  2015      B       Paris
# 8:  2015      B      London
# 9:  2015      B      Berlin
#10:  2016      B       Paris
#11:  2016      B      London
#12:  2016      B      Berlin

并在dplyr

library(dplyr)

testTable %>%
  group_by(policy) %>%
  filter(destination %in% Reduce(intersect, split(destination, years)))

推荐阅读