Как вообще использовать combn, когда пары не всегда возможны?

Я ищу общий метод для ситуаций, в которых требуются комбинации, но когда данные не всегда соответствуют предположениям функции combn.

В частности, у меня есть данные о членах Конгресса и их назначениях в комитетах. Чтобы изучить эту сеть политиков, я хочу объединить (то есть создать связи между) любых членов, которые принадлежат к одним и тем же комитетам.

Данные выглядят так:

name_id     assignment
 A000374    Agriculture
 A000370    Agriculture
 A000055 Appropriations
 A000371 Appropriations
 A000372    Agriculture
 A000376        Foreign

Итак, итоговые сетевые данные должны выглядеть так:

from       to          committee
A000374    A000370     Agriculture
A000055    A000371     Appropriations

Проблема в том, что мой код (ниже) выдает ошибку, потому что не всегда есть пары (команда ncombn в коде, который идентифицирует такие случаи. Это правильный подход, и если да, то как создать команду, которая обычно учитывает эту проблему ?

Вот мой код на данный момент:

library(RCurl)
x <- getURL("https://raw.githubusercontent.com/bac3917/Cauldron/master/cstack.csv")
cstack <- read.csv(text = x)

# split the string into two columns that represent name_id and committee assignment
cstack <- cstack %>% separate(namePaste, c("name_id","assignment")) 

# use combn and dplyr to create pairs (results in error)
edges<-cstack %>% 
  group_by(assignment) %>%
  do(as.data.frame(t(combn(.[["name_id"]], 2)))) %>%
  group_by(V1, V2) %>% 
  summarise(n( ))

person Ben    schedule 27.02.2020    source источник
comment
Я думаю, вы получаете это сообщение об ошибке, потому что в некоторых комитетах есть только один член, поэтому combn к ним не применимо. Вы можете попробовать отфильтровать назначения только с одним участником, а затем выполнить повторный запуск.   -  person ulfelder    schedule 28.02.2020


Ответы (1)


Как сказал Бен, combn(x, 2) не работает для x < 2. Вы можете определить функцию, которая вычисляет combn, только когда x > 1. Ниже представлена ​​версия data.table.

library(data.table)
cstack <- fread("https://raw.githubusercontent.com/bac3917/Cauldron/master/cstack.csv",
    header=TRUE)[, tstrsplit(sub(" ", "\01", namePaste), "\01")]
setnames(cstack, c("name_id","assignment"))
mycomb <- function(x) if(length(x) > 1) data.table(t(combn(x, 2)))
cstack <- cstack[, mycomb(name_id), by = "assignment"]
setcolorder(cstack, c(2,3,1))
setnames(cstack, c("V1", "V2"), c("from", "to"))
cstack
#>           from      to      assignment
#>     1: A000374 A000370     Agriculture
#>     2: A000374 A000372     Agriculture
#>     3: A000374 A000378     Agriculture
#>     4: A000374 B001298     Agriculture
#>     5: A000374 B001307     Agriculture
#>    ---                                
#> 12957: C001053 L000491  Ranking Member
#> 12958: C001053 R000582  Ranking Member
#> 12959: D000619 L000491  Ranking Member
#> 12960: D000619 R000582  Ranking Member
#> 12961: L000491 R000582  Ranking Member
person user12728748    schedule 28.02.2020