在 R(或 Stata)中按组组合行
Combine rows per groups in R (or Stata)
我在 R(或 Stata)中遇到无法解决的问题。我有一个数据库,示例如下:
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
我需要一份同一组内 ID 交互的列表(即:在给定年份在同一家公司工作)以进行网络分析。
类似于以下内容:
Year
ID
Firm
Group
Interactions_A
Interactions_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中可以先得到每组ID之间的所有组合,然后格式化数据得到每个节点一列。
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")
我在 R(或 Stata)中遇到无法解决的问题。我有一个数据库,示例如下:
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 |
我需要一份同一组内 ID 交互的列表(即:在给定年份在同一家公司工作)以进行网络分析。 类似于以下内容:
Year | ID | Firm | Group | Interactions_A | Interactions_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中可以先得到每组ID之间的所有组合,然后格式化数据得到每个节点一列。
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")