从 group1、group2、overlap_count 创建一个重叠矩阵?
Create an overlap matrix from group1, group2, overlap_count?
我有一个数据框,其中 g1、g2 代表两个组,还有一个 val 列,代表 g1 中有多少项目也可以在 g2 中找到。
## Input dataframe
data.frame(
g1 = c('a','a','a','b','b','b','c','c','c','d'),
g2 = c('a','b','c','a','b','c','a','b','c','d'),
val = c(10,4,1,4,5,0,1,0,3,4),
stringsAsFactors = FALSE
)
我在格式化数据框时遇到问题,如下所示。我可以使用 g1/g2 中不同的 column/row 名称创建一个空的命名矩阵,并遍历输入数据框中的每一行,将其值写入匹配的 g1: row-id g2: column-id 组合,但这似乎效率低下;我想知道是否有任何图书馆提供了自动化的方法?
## Output overlap matrix
data.frame(a = c(10,4,1,0),
b = c(4,5,0,0),
c = c(1,0,3,0),
d = c(0,0,0,4),
row.names = c('a','b','c','d'))
之前有人问过与 overlap between groups 类似的问题,但是我们有一个组列表和其中的项目,并且想要找出组之间有多少项目重叠。
在这里,我知道有多少项在组之间重叠,但我无法正确设置格式。
这与 How to reshape data from long to wide format 类似,但略有不同,即 id 列应保留为行名称。为此,我们可以使用 reshape2::acast
.
reshape2::acast(Input_dataframe, formula = g1 ~ g2, fill = 0)
# > a b c d
# > a 10 4 1 0
# > b 4 5 0 0
# > c 1 0 3 0
# > d 0 0 0 4
如果您(或其他人)正在寻找 tidyverse
解决方案,这会有所帮助
tidyr::pivot_wider(df, g1, names_from = g2, values_from = val, values_fill = 0) %>%
tibble::column_to_rownames("g1")
# a b c d
# a 10 4 1 0
# b 4 5 0 0
# c 1 0 3 0
# d 0 0 0 4
此解决方案使用 data.table 库。
dcast(setDT(df), g1 ~ g2, value.var = "val", fill = 0)
在base R
中,我们可以使用xtabs
xtabs(val ~ g1 + g2, df1)
# g2
#g1 a b c d
# a 10 4 1 0
# b 4 5 0 0
# c 1 0 3 0
# d 0 0 0 4
我有一个数据框,其中 g1、g2 代表两个组,还有一个 val 列,代表 g1 中有多少项目也可以在 g2 中找到。
## Input dataframe
data.frame(
g1 = c('a','a','a','b','b','b','c','c','c','d'),
g2 = c('a','b','c','a','b','c','a','b','c','d'),
val = c(10,4,1,4,5,0,1,0,3,4),
stringsAsFactors = FALSE
)
我在格式化数据框时遇到问题,如下所示。我可以使用 g1/g2 中不同的 column/row 名称创建一个空的命名矩阵,并遍历输入数据框中的每一行,将其值写入匹配的 g1: row-id g2: column-id 组合,但这似乎效率低下;我想知道是否有任何图书馆提供了自动化的方法?
## Output overlap matrix
data.frame(a = c(10,4,1,0),
b = c(4,5,0,0),
c = c(1,0,3,0),
d = c(0,0,0,4),
row.names = c('a','b','c','d'))
之前有人问过与 overlap between groups 类似的问题,但是我们有一个组列表和其中的项目,并且想要找出组之间有多少项目重叠。
在这里,我知道有多少项在组之间重叠,但我无法正确设置格式。
这与 How to reshape data from long to wide format 类似,但略有不同,即 id 列应保留为行名称。为此,我们可以使用 reshape2::acast
.
reshape2::acast(Input_dataframe, formula = g1 ~ g2, fill = 0)
# > a b c d
# > a 10 4 1 0
# > b 4 5 0 0
# > c 1 0 3 0
# > d 0 0 0 4
如果您(或其他人)正在寻找 tidyverse
解决方案,这会有所帮助
tidyr::pivot_wider(df, g1, names_from = g2, values_from = val, values_fill = 0) %>%
tibble::column_to_rownames("g1")
# a b c d
# a 10 4 1 0
# b 4 5 0 0
# c 1 0 3 0
# d 0 0 0 4
此解决方案使用 data.table 库。
dcast(setDT(df), g1 ~ g2, value.var = "val", fill = 0)
在base R
中,我们可以使用xtabs
xtabs(val ~ g1 + g2, df1)
# g2
#g1 a b c d
# a 10 4 1 0
# b 4 5 0 0
# c 1 0 3 0
# d 0 0 0 4