R- 将邻接数据框转换为边缘列表类型列表
R- Convert adjacency data frame to edgelist type list
我需要将具有命名列和行(NxN 维度)的数据框更改为边列表。
例如数据框中的矩阵是:
C1 C2 C3 C4
Ane 0 1 31 0
Jol 4 14 2 0
Ruf 3 3 11 6
Rei 1 7 0 0
我想将其更改为列表(如边列表):
Ane-C1 0
Ane-C2 1
Ane-C3 31
Ane-C4 0
Jol-C1 4
Jol-C2 14
Jol-C3 2
Jol-C4 0
Ruf-C1 3
Ruf-C2 3
Ruf-C3 11
Ruf-C4 6
Rei-C1 1
Rei-C2 7
Rei-C3 0
Rei-C4 0
我发现的其他线程似乎只有列名/数据框不包含邻接矩阵。
我试着把它做成图表,然后 get.edgelist,也试过 [order(df[1],df[1,]),drop=FALSE] 但那些没有给出什么我想。
谁能帮忙教教我?
在base R
中,复制行名和列名,paste
它,根据它和矩阵
的值创建一个data.frame
data.frame(name = paste(rownames(m1)[col(m1)], colnames(m1)[row(m1)], sep="-"),
val = c(t(m1)), stringsAsFactors = FALSE)
# name val
#1 Ane-C1 0
#2 Ane-C2 1
#3 Ane-C3 31
#4 Ane-C4 0
#5 Jol-C1 4
#6 Jol-C2 14
#7 Jol-C3 2
#8 Jol-C4 0
#9 Ruf-C1 3
#10 Ruf-C2 3
#11 Ruf-C3 11
#12 Ruf-C4 6
#13 Rei-C1 1
#14 Rei-C2 7
#15 Rei-C3 0
#16 Rei-C4 0
这是一个 tidyverse 解决方案。使用 gather
从宽格式转换为长格式。然后,unite
将两列合二为一。
library('tidyverse')
df <- data.frame(
C1 = c(0, 4, 3, 1),
C2 = c(1, 14, 3, 7),
C3 = c(31, 2, 11, 0),
C4 = c(0, 0, 4, 0),
row.names = c('Ane', 'Jol', 'Ruf', 'Rei')
)
df %>%
rownames_to_column %>%
gather(key = 'key', value = 'value', -rowname) %>%
unite('name', rowname, key, sep = '-')
#> name value
#> 1 Ane-C1 0
#> 2 Jol-C1 4
#> 3 Ruf-C1 3
#> 4 Rei-C1 1
#> 5 Ane-C2 1
#> 6 Jol-C2 14
#> 7 Ruf-C2 3
#> 8 Rei-C2 7
#> 9 Ane-C3 31
#> 10 Jol-C3 2
#> 11 Ruf-C3 11
#> 12 Rei-C3 0
#> 13 Ane-C4 0
#> 14 Jol-C4 0
#> 15 Ruf-C4 4
#> 16 Rei-C4 0
根据 user20650 指出的 reshape
melt
的更完整答案:
# add rowname to original data frame.
df$row<-rownames(df)
df1<-melt(df)
elist<-data.frame(names=paste(df1$row,df1$variable,sep="-"),value=df1$value)
一个data.frame
的解决方案是这样的:
data.frame(name = paste(rownames(df)[row(df)], colnames(df)[col(df)], sep="-"),value = c(as.matrix(df)))
melt
给您更多的控制权。你可以这样做:
melt(df[1:2,3:4])
将第 1,2 行和第 3,4 列转换为边缘列表。
我需要将具有命名列和行(NxN 维度)的数据框更改为边列表。
例如数据框中的矩阵是:
C1 C2 C3 C4
Ane 0 1 31 0
Jol 4 14 2 0
Ruf 3 3 11 6
Rei 1 7 0 0
我想将其更改为列表(如边列表):
Ane-C1 0
Ane-C2 1
Ane-C3 31
Ane-C4 0
Jol-C1 4
Jol-C2 14
Jol-C3 2
Jol-C4 0
Ruf-C1 3
Ruf-C2 3
Ruf-C3 11
Ruf-C4 6
Rei-C1 1
Rei-C2 7
Rei-C3 0
Rei-C4 0
我发现的其他线程似乎只有列名/数据框不包含邻接矩阵。
我试着把它做成图表,然后 get.edgelist,也试过 [order(df[1],df[1,]),drop=FALSE] 但那些没有给出什么我想。 谁能帮忙教教我?
在base R
中,复制行名和列名,paste
它,根据它和矩阵
data.frame
data.frame(name = paste(rownames(m1)[col(m1)], colnames(m1)[row(m1)], sep="-"),
val = c(t(m1)), stringsAsFactors = FALSE)
# name val
#1 Ane-C1 0
#2 Ane-C2 1
#3 Ane-C3 31
#4 Ane-C4 0
#5 Jol-C1 4
#6 Jol-C2 14
#7 Jol-C3 2
#8 Jol-C4 0
#9 Ruf-C1 3
#10 Ruf-C2 3
#11 Ruf-C3 11
#12 Ruf-C4 6
#13 Rei-C1 1
#14 Rei-C2 7
#15 Rei-C3 0
#16 Rei-C4 0
这是一个 tidyverse 解决方案。使用 gather
从宽格式转换为长格式。然后,unite
将两列合二为一。
library('tidyverse')
df <- data.frame(
C1 = c(0, 4, 3, 1),
C2 = c(1, 14, 3, 7),
C3 = c(31, 2, 11, 0),
C4 = c(0, 0, 4, 0),
row.names = c('Ane', 'Jol', 'Ruf', 'Rei')
)
df %>%
rownames_to_column %>%
gather(key = 'key', value = 'value', -rowname) %>%
unite('name', rowname, key, sep = '-')
#> name value
#> 1 Ane-C1 0
#> 2 Jol-C1 4
#> 3 Ruf-C1 3
#> 4 Rei-C1 1
#> 5 Ane-C2 1
#> 6 Jol-C2 14
#> 7 Ruf-C2 3
#> 8 Rei-C2 7
#> 9 Ane-C3 31
#> 10 Jol-C3 2
#> 11 Ruf-C3 11
#> 12 Rei-C3 0
#> 13 Ane-C4 0
#> 14 Jol-C4 0
#> 15 Ruf-C4 4
#> 16 Rei-C4 0
根据 user20650 指出的 reshape
melt
的更完整答案:
# add rowname to original data frame.
df$row<-rownames(df)
df1<-melt(df)
elist<-data.frame(names=paste(df1$row,df1$variable,sep="-"),value=df1$value)
一个data.frame
的解决方案是这样的:
data.frame(name = paste(rownames(df)[row(df)], colnames(df)[col(df)], sep="-"),value = c(as.matrix(df)))
melt
给您更多的控制权。你可以这样做:
melt(df[1:2,3:4])
将第 1,2 行和第 3,4 列转换为边缘列表。