如何根据参考数据框在给定条件下填充空白矩阵?
How do I fill a blank matrix given conditions from a refernce dataframe?
我正在尝试组织一个矩阵,显示诱捕集中的哪些个体被一起捕获。
目前我有一个空白矩阵,其中的行和列以数据集中的每个人命名
my_sociomatrix = matrix(, nrow = 389, ncol = 389)
diag(my_sociomatrix) <- 0
names_list<- unique(df$individual)
names_list
rownames(my_sociomatrix)<-names_list
colnames(my_sociomatrix)<-names_list
我想做的是根据个体被抓到一起的次数分配“1、2、3……或 0”。
我有一个单独的数据框,其中包含确定哪些人在每个诱捕事件中被捕获所需的信息。有些人被多次抓到,所以他们出现不止一次。
individual
trap event
NA002
A
NA03,41
A
NA03,42
B
NA03,41
C
NA03,42
C
NA03,43
C
NA002
D
NA03,41
D
NA03,44
D
NA03,45
D
我想使用数据框的引用来填充矩阵,这样矩阵就会像这样填充。我无法手动执行此操作,因为整个矩阵是 389x389 个单元格。
NA002
NA03,41
NA03,42
NA03,43
NA03,44
NA03,45
NA002
-
NA03,41
2
-
NA03,42
0
1
-
NA03,43
0
1
1
-
NA03,44
1
1
0
0
-
NA03,45
1
1
0
0
1
-
个体 NA002 和 NA03,41 被抓在一起两次,所以他们被分配了 2。个体 NA002 和 NA03,42 从未被抓在一起,所以他们得到了 0。个体 NA002 和 NA03,44 被抓在一起一次, 所以他们得到 1,依此类推...
如何使用基于我的数据框的条件来填写我的矩阵?我已经使用 R 几年了,但这种类型的工作对我来说是全新的,因为我以前从未接触过矩阵。
我在考虑使用 basic
net[,]=
但带有 ifelse 语句,但我不确定如何执行此操作。
获取个人分享陷阱事件的频率
library(dplyr)
library(tidyverse)
df = data.frame(individual = c("NA002","NA03,41","NA03,42","NA03,41","NA03,42","NA03,43","NA002","NA03,41","NA03,44","NA03,45"),"trap event" = c("A","A","B","C","C","C","D","D","D","D"))
df %>% mutate(n = 1) %>%
spread(individual, n, fill=0) %>%
select(-trap_event) %>%
{crossprod(as.matrix(.))} %>%
`diag<-`(0)
输出:
NA002 NA03,41 NA03,42 NA03,43 NA03,44 NA03,45
NA002 0 2 0 0 1 1
NA03,41 2 0 1 1 1 1
NA03,42 0 1 0 1 0 0
NA03,43 0 1 1 0 0 0
NA03,44 1 1 0 0 0 1
NA03,45 1 1 0 0 1 0
谢谢 cgvoller,你的代码很棒。这是任何感兴趣的人的略微编辑的代码。如果您不能在原始 df 的一行子集中写出您的 df,那么它只有您需要的两列。
df2 <- Rsnappers[, c("trap_event", "individual")]
head(df2)
df2 %>% mutate(n = 1) %>%
spread(individual, n, fill=0) %>%
select(-trap_event) %>%
{crossprod(as.matrix(.))} %>%
`diag<-`(0)
#add to matrix
my_sociomatrix <- df2 %>% mutate(n = 1) %>%
spread(individual, n, fill=0) %>%
select(-trap_event) %>%
{crossprod(as.matrix(.))} %>%
`diag<-`(0)```
我正在尝试组织一个矩阵,显示诱捕集中的哪些个体被一起捕获。 目前我有一个空白矩阵,其中的行和列以数据集中的每个人命名
my_sociomatrix = matrix(, nrow = 389, ncol = 389)
diag(my_sociomatrix) <- 0
names_list<- unique(df$individual)
names_list
rownames(my_sociomatrix)<-names_list
colnames(my_sociomatrix)<-names_list
我想做的是根据个体被抓到一起的次数分配“1、2、3……或 0”。
我有一个单独的数据框,其中包含确定哪些人在每个诱捕事件中被捕获所需的信息。有些人被多次抓到,所以他们出现不止一次。
individual | trap event |
---|---|
NA002 | A |
NA03,41 | A |
NA03,42 | B |
NA03,41 | C |
NA03,42 | C |
NA03,43 | C |
NA002 | D |
NA03,41 | D |
NA03,44 | D |
NA03,45 | D |
我想使用数据框的引用来填充矩阵,这样矩阵就会像这样填充。我无法手动执行此操作,因为整个矩阵是 389x389 个单元格。
NA002 | NA03,41 | NA03,42 | NA03,43 | NA03,44 | NA03,45 | |
---|---|---|---|---|---|---|
NA002 | - | |||||
NA03,41 | 2 | - | ||||
NA03,42 | 0 | 1 | - | |||
NA03,43 | 0 | 1 | 1 | - | ||
NA03,44 | 1 | 1 | 0 | 0 | - | |
NA03,45 | 1 | 1 | 0 | 0 | 1 | - |
个体 NA002 和 NA03,41 被抓在一起两次,所以他们被分配了 2。个体 NA002 和 NA03,42 从未被抓在一起,所以他们得到了 0。个体 NA002 和 NA03,44 被抓在一起一次, 所以他们得到 1,依此类推...
如何使用基于我的数据框的条件来填写我的矩阵?我已经使用 R 几年了,但这种类型的工作对我来说是全新的,因为我以前从未接触过矩阵。
我在考虑使用 basic
net[,]=
但带有 ifelse 语句,但我不确定如何执行此操作。
获取个人分享陷阱事件的频率
library(dplyr)
library(tidyverse)
df = data.frame(individual = c("NA002","NA03,41","NA03,42","NA03,41","NA03,42","NA03,43","NA002","NA03,41","NA03,44","NA03,45"),"trap event" = c("A","A","B","C","C","C","D","D","D","D"))
df %>% mutate(n = 1) %>%
spread(individual, n, fill=0) %>%
select(-trap_event) %>%
{crossprod(as.matrix(.))} %>%
`diag<-`(0)
输出:
NA002 NA03,41 NA03,42 NA03,43 NA03,44 NA03,45
NA002 0 2 0 0 1 1
NA03,41 2 0 1 1 1 1
NA03,42 0 1 0 1 0 0
NA03,43 0 1 1 0 0 0
NA03,44 1 1 0 0 0 1
NA03,45 1 1 0 0 1 0
谢谢 cgvoller,你的代码很棒。这是任何感兴趣的人的略微编辑的代码。如果您不能在原始 df 的一行子集中写出您的 df,那么它只有您需要的两列。
df2 <- Rsnappers[, c("trap_event", "individual")]
head(df2)
df2 %>% mutate(n = 1) %>%
spread(individual, n, fill=0) %>%
select(-trap_event) %>%
{crossprod(as.matrix(.))} %>%
`diag<-`(0)
#add to matrix
my_sociomatrix <- df2 %>% mutate(n = 1) %>%
spread(individual, n, fill=0) %>%
select(-trap_event) %>%
{crossprod(as.matrix(.))} %>%
`diag<-`(0)```