r - R中的关联数据框

我正在尝试在病毒与其宿主之间建立关联矩阵。我有一个包含 2 列(病原体和主机)的数据框,如下所示:

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

我想要一个 dataframe 包含关联为 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

有没有一种简单的方法可以做到这一点?

回答1

使用 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

但要知道许多工具(尤其是 dplyrtidyverse 元包中的其他包)会忽略并且有时会故意删除行名,因此通常不鼓励使用它们,而是建议将它们移动到显式列(例如, 使用 tibble::rownames_to_column,在基础 R 中也很容易)。

相似文章