我试图在病毒和它们的宿主之间建立一个关联矩阵。我有一个数据框架,其中包含两列(病原体和宿主),如下所示:
pathogen <- c("A_virus", "B_virus","B_virus", "C_virus","C_virus", "D_virus", "D_virus")
host <- c("Human", "Human","Dog", "Lion", "Human", "Gorilla", "Dog")
FoundIn <- data.frame(pathogen,host)
FoundIn
pathogen host
[1] A_virus Human
[2] B_virus Human
[3] B_virus Dog
[4] C_virus Lion
[5] C_virus Human
[6] D_virus Gorilla
[7] D_virus Dog我想要一个包含关联为1而非关联为0的数据文件,如下所示:
Human Dog Lion Gorilla
A_virus 1 0 0 0
B_virus 1 1 0 0
C_virus 1 0 1 0
D_virus 0 1 0 1 有什么简单的方法吗?
发布于 2022-05-18 21:38:02
使用xtabs
xtabs(~ pathogen + host, data = FoundIn)
# host
# pathogen Dog Gorilla Human Lion
# A_virus 0 0 1 0
# B_virus 1 0 1 0
# C_virus 0 0 1 1
# D_virus 1 1 0 0或
table(FoundIn$pathogen, FoundIn$host) # same output注意,这不是data.frame,而是类table。为了将该格式转换为data.frame,您必须使用行名。这当然是可行的
tbl <- xtabs(~ pathogen + host, data = FoundIn)
class(tbl) <- "matrix"
as.data.frame(tbl)
# Dog Gorilla Human Lion
# A_virus 0 0 1 0
# B_virus 1 0 1 0
# C_virus 0 0 1 1
# D_virus 1 1 0 0但是要知道,许多工具(特别是dplyr和tidyverse元包中的其他包)忽略并有时故意删除行名,因此经常不鼓励使用它们,建议将它们移到一个显式列(例如,使用tibble::rownames_to_column,在基本R中也很容易)。
https://stackoverflow.com/questions/72296265
复制相似问题