如何通过变量频率的年份组合来查找?

时间:2019-07-17 16:26:01

标签: r

我有三个不同的数据帧 关键/相同变量是索引。 其他列包含1或0(如果该值不存在)

dfq <- structure(list(index = c("S14", "S65", "S32", "S13", "S15", "S17", "S2", "S21", "S46", "S5", "S56", "S57", "S6", "S63", "S64", "S68", "S72", "S78", "S1", "S10", "S11", "S12", "S16", "S18", "S19", "S20", "S22", "S23", "S24", "S25", "S26", "S27", "S28", "S29", "S3", "S30", "S31", "S33", "S34", "S35", "S36", "S37", "S38", "S39", "S4", "S40", "S41", "S42", "S43", "S44", "S45", "S47", "S48", "S49", "S50", "S51", "S52", "S53", "S54", "S55", "S58", "S59", "S60", "S61", "S62", "S66", "S67", "S69", "S7", "S70", "S71", "S73", "S74", "S75", "S76", "S77", "S79", "S8", "S80", "S81", "S82", "S83", "S84", "S85", "S9"), D1 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L), D2 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), D3 = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L ), D4 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), D5 = c(1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), D6 = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA, -85L))
dfe <- structure(list(index = c("S1", "S10", "S11", "S12", "S13", "S14", "S15", "S16", "S17", "S18", "S19", "S2", "S20", "S21", "S22", "S23", "S24", "S25", "S26", "S27", "S28", "S29", "S3", "S30", "S31", "S32", "S33", "S34", "S35", "S36", "S37", "S38", "S39", "S4", "S40", "S41", "S42", "S43", "S44", "S45", "S46", "S47", "S48", "S49", "S5", "S50", "S51", "S52", "S53", "S54", "S55", "S56", "S57", "S58", "S59", "S6", "S60", "S61", "S62", "S63", "S64", "S65", "S66", "S67", "S68", "S69", "S7", "S70", "S71", "S72", "S73", "S74", "S75", "S76", "S77", "S78", "S79", "S8", "S80", "S81", "S82", "S83", "S84", "S85", "S9"), E1 = c(1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L), E2 = c(1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L), E3 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), E4 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA, -85L))
dfy <- structure(list(index = c("S1", "S10", "S11", "S12", "S13", "S14", "S15", "S16", "S17", "S18", "S19", "S2", "S20", "S21", "S22", "S23", "S24", "S25", "S26", "S27", "S28", "S29", "S3", "S30", "S31", "S32", "S33", "S34", "S35", "S36", "S37", "S38", "S4", "S40", "S41", "S42", "S43", "S44", "S45", "S46", "S47", "S48", "S49", "S5", "S50", "S51", "S52", "S53", "S54", "S55", "S56", "S57", "S58", "S59", "S6", "S60", "S61", "S62", "S63", "S64", "S65", "S66", "S67", "S68", "S69", "S7", "S70", "S71", "S72", "S73", "S74", "S75", "S76", "S77", "S78", "S79", "S8", "S80", "S81", "S82", "S83", "S84", "S85", "S9", "S39"), year = c(2017L, 2018L, 2017L, 2018L, 2017L, 2014L, 2015L, 2017L, 2015L, 2017L, 2018L, 2015L, 2014L, 2016L, 2015L, 2013L, 2012L, 2018L, 2018L, 2016L, 2017L, 2012L, 2018L, 2015L, 2018L, 2018L, 2018L, 2018L, 2017L, 2009L, 2017L, 2016L, 2015L, 2014L, 2012L, 2018L, 2016L, 2017L, 2013L, 2018L, 2019L, 2008L, 2018L, 2017L, 2018L, 2016L, 2017L, 2017L, 2018L, 2017L, 2017L, 2016L, 2018L, 2019L, 2014L, 2019L, 2018L, 2016L, 2017L, 2017L, 2018L, 2016L, 2016L, 2016L, 2017L, 2013L, 2013L, 2016L, 2014L, 2018L, 2012L, 2014L, 2013L, 2018L, 2017L, 2018L, 2018L, 2018L, 2015L, 2018L, 2018L, 2016L, 2017L, 2017L, 2017L)), class = "data.frame", row.names = c(NA, -85L))

现在可以检测是否存在dfe + dfq的组合: 小例子:

combination, year, frq
D1 + E1, 2018, 2
D1 + E1, 2018, 0

例如编辑:

使用关键列将所有数据框合并为一个:

dfa <- merge(dfq, dfe, id="index")
dfa2 <- merge(dfa, dfy, id="index")

我所说的2019年的例子 步骤1:

index, combination, year
S47, D6 + E2, 2019
S59, D3 + E1, 2019
S59, D3 + E2, 2019
S59, D3 + E4, 2019
S60, D6 + E2, 2019

最终输出:

combination, year, frq
D6 + E2, 2019, 2
D3 + E1, 2019, 1
D3 + E2, 2019, 1
D3 + E4, 2019, 1

如何才能产生与过去几年一样的最终结果

1 个答案:

答案 0 :(得分:0)

我不确定这是否是您要寻找的东西,但请放一些东西。使用dplyr,我获取了数据帧并将其变长,并进行了过滤,因此仅保留了带有“ 1”的变量。然后设置所有D1-6和E1-4变量的成对组合,并进行过滤,以使其余行的D中有一个变量,E中有一个变量。最后,计算唯一年份和D + E组合的频率。我相信有更好的方法可以做到这一点,但希望对您有所帮助。

library(dplyr)

dfa3 <- dfa2 %>%
  gather(combination, value, -c(index, year)) %>%
  filter(value==1) 

dfa3 <- dfa3 %>%
  group_by(index, year) %>%
  do({
    setNames(
      data.frame(t(combn(.$combination, 2)), stringsAsFactors = F),
      c('c1', 'c2')
    )
  }) 

dfa3 <- dfa3 %>%
  filter(c1 %in% names(dfq) & c2 %in% names(dfe)) %>%
  group_by(year, c1, c2) %>%
  mutate(frq = n(),
         combination = paste(c1, c2, sep=' + ')) %>%
  slice(1) %>%
  arrange(desc(year), index) %>%
  ungroup() %>%
  select(-c(index, c1, c2))

R> dfa3
# A tibble: 57 x 3
    year   frq combination
   <int> <int> <chr>      
 1  2019     2 D6 + E2    
 2  2019     1 D3 + E1    
 3  2019     1 D3 + E2    
 4  2019     1 D3 + E4    
 5  2018     8 D3 + E2    
 6  2018     1 D3 + E1    
 7  2018     5 D3 + E4    
 8  2018     2 D6 + E4    
 9  2018     3 D4 + E2    
10  2018     5 D6 + E2  
# … with 47 more rows