У меня есть проблема в R (или Stata), которую я не могу решить. У меня есть база данных, как показано ниже:
Год | Я БЫ | Твердый | Группа |
---|---|---|---|
2000 г. | 1 | 1 | 1 |
2000 г. | 2 | 1 | 1 |
2000 г. | 3 | 2 | 2 |
2000 г. | 4 | 2 | 2 |
2000 г. | 5 | 2 | 2 |
2000 г. | 6 | 3 | 3 |
2001 г. | 1 | 1 | 4 |
2001 г. | 2 | 1 | 4 |
2001 г. | 3 | 1 | 4 |
2001 г. | 4 | 2 | 5 |
2001 г. | 5 | 2 | 5 |
2001 г. | 6 | 3 | 6 |
Мне потребуется список взаимодействий идентификаторов в одной группе (т. е. работа в одной фирме в определенный год) для сетевого анализа. Что-то вроде следующего:
Год | Я БЫ | Твердый | Группа | Взаимодействия_A | Взаимодействия_B |
---|---|---|---|---|---|
2000 г. | 1 | 1 | 1 | 1 | 2 |
2000 г. | 2 | 1 | 1 | 3 | 4 |
2000 г. | 3 | 2 | 2 | 3 | 5 |
2000 г. | 4 | 2 | 2 | 4 | 5 |
2000 г. | 5 | 2 | 2 | 6 | |
2000 г. | 6 | 3 | 3 | ||
2001 г. | 1 | 1 | 4 | 1 | 2 |
2001 г. | 2 | 1 | 4 | 1 | 3 |
2001 г. | 3 | 1 | 4 | 2 | 3 |
2001 г. | 4 | 2 | 5 | 4 | 5 |
2001 г. | 5 | 2 | 5 | 6 | |
2001 г. | 6 | 3 | 6 |
Есть ли предложения сделать это в R (также можно в Stata)?
Большое спасибо за вашу помощь!
В R вы можете сначала получить все комбинации между идентификаторами каждой группы, а затем отформатировать данные, чтобы получить один столбец для каждого узла.
library(tidyverse)
dat %>%
group_by(Group) %>%
summarise(new = ifelse(n() > 1, paste(combn(ID, 2), collapse = "-"), as.character(ID))) %>%
separate_rows(new, sep = "(?:[^-]*(?:-[^-]*){1})\\K-") %>%
separate(new, into = c("Interactions_A", "Interactions_B"))
Group Interactions_A Interactions_B
<int> <chr> <chr>
1 1 1 2
2 2 3 4
3 2 3 5
4 2 4 5
5 3 6 NA
6 4 1 2
7 4 1 3
8 4 2 3
9 5 4 5
10 6 6 NA
данные
dat <- read.table(header= T, text = "Year ID Firm Group
2000 1 1 1
2000 2 1 1
2000 3 2 2
2000 4 2 2
2000 5 2 2
2000 6 3 3
2001 1 1 4
2001 2 1 4
2001 3 1 4
2001 4 2 5
2001 5 2 5
2001 6 3 6")
большое спасибо за вашу помощь! Вы молодец, решение кажется именно тем, что мне нужно. Сейчас я пытаюсь работать с большим набором данных, который, как и ожидалось, занимает много времени. Я получаю сообщение об ошибке "результат превысит 2 ^ 31-1 байт". Я попытаюсь выяснить это, возможно, с меньшими наборами данных, но это должно работать, как в образце. Большое спасибо!
В больших группах количество комбинаций растет экспоненциально, поэтому вы быстро получаете слишком много строк. Это может означать, что это не правильный подход.
Точно, ты прав. Решение именно то, что мне нужно, но, к сожалению, это невозможно в очень больших наборах данных. Спасибо еще раз!
С dplyr
left_join(x,x, by = c("Firm", "Year")
даст вам старт.