在R中提取社交网络结构
Extracting social networking structure in R
我正在尝试为网络分析准备一个特定的数据集,但首先,我需要从该数据中提取节点之间的关系。数据以下列格式显示:
id | structure_var
1 | 1
2 | 1.1
3 | 1.2
4 | 1.2.1
5 | 1.2.2
6 | 1.3
7 | 2
8 | 2.1
9 | 2.1.1
所需的输出是这样的(来自和对应于上面的 ID 值):
from | to
1 | 2
1 | 3
1 | 6
3 | 4
3 | 5
7 | 8
8 | 9
到目前为止我能想到的最好的是:
library(stringr)
extract_structure = function(x,y=seq_along(x),connections=character()){
depth = str_count(x,"\.")
parent = gsub("(\d+)\..*","\1",x)
parent_iterator = as.numeric(unique(parent))
for(i in parent_iterator){
a = y[which(x==as.character(i))]
b = y[which(depth==1 & parent==i)]
if(length(a)>0 & length(b)>0){connections = c(connections,paste(a,b,sep="-"))}
}
zero_depth = which(depth<1)
next_y = y[-zero_depth]
next_x = gsub("^\d+\.","",x[-zero_depth])
if(sum(depth)>0){extract_structure(x=next_x,y=next_y,connections=connections)}
else{return(connections)}
}
extract_structure(x=comment_structure)
"1-2" "1-3" "1-6" "7-8" "2-9" "8-9" "3-4" "3-5"
但如您所见,答案不保留历史记录,这就是为什么它在不应该连接 2 和 9 的时候连接了 2 和 9。有人对如何最好地编程有什么建议吗?
非常感谢!
这可以通过字符串处理非常轻松地完成。
library(dplyr)
library(stringi)
merge(data %>% rename(from_ID = id,
from_structure = structure_var),
data %>% rename(to_ID = id,
to_structure = structure_var) ) %>%
filter(paste0("^", from_structure , "\.[0-9]$") %>%
stri_detect_regex(to_structure, .) )
我正在尝试为网络分析准备一个特定的数据集,但首先,我需要从该数据中提取节点之间的关系。数据以下列格式显示:
id | structure_var
1 | 1
2 | 1.1
3 | 1.2
4 | 1.2.1
5 | 1.2.2
6 | 1.3
7 | 2
8 | 2.1
9 | 2.1.1
所需的输出是这样的(来自和对应于上面的 ID 值):
from | to
1 | 2
1 | 3
1 | 6
3 | 4
3 | 5
7 | 8
8 | 9
到目前为止我能想到的最好的是:
library(stringr)
extract_structure = function(x,y=seq_along(x),connections=character()){
depth = str_count(x,"\.")
parent = gsub("(\d+)\..*","\1",x)
parent_iterator = as.numeric(unique(parent))
for(i in parent_iterator){
a = y[which(x==as.character(i))]
b = y[which(depth==1 & parent==i)]
if(length(a)>0 & length(b)>0){connections = c(connections,paste(a,b,sep="-"))}
}
zero_depth = which(depth<1)
next_y = y[-zero_depth]
next_x = gsub("^\d+\.","",x[-zero_depth])
if(sum(depth)>0){extract_structure(x=next_x,y=next_y,connections=connections)}
else{return(connections)}
}
extract_structure(x=comment_structure)
"1-2" "1-3" "1-6" "7-8" "2-9" "8-9" "3-4" "3-5"
但如您所见,答案不保留历史记录,这就是为什么它在不应该连接 2 和 9 的时候连接了 2 和 9。有人对如何最好地编程有什么建议吗?
非常感谢!
这可以通过字符串处理非常轻松地完成。
library(dplyr)
library(stringi)
merge(data %>% rename(from_ID = id,
from_structure = structure_var),
data %>% rename(to_ID = id,
to_structure = structure_var) ) %>%
filter(paste0("^", from_structure , "\.[0-9]$") %>%
stri_detect_regex(to_structure, .) )