如何创建通过ID / R中的行根据组合计算出的共现矩阵?

问题描述 投票:2回答:2

更新

感谢@jazzurro的帮助。这使我意识到重复项可能会使事情复杂化。我希望仅保留唯一的值/行可以简化任务。*

df <- data.frame(ID = c(1,2,3,4,5), 
                  CTR1 = c("England", "England", "England", "China", "Sweden"),
                  CTR2 = c("England", "China", "China", "England", NA),
                  CTR3 = c("USA", "USA", "USA", "USA", NA),
                  CTR4 = c(NA, NA, NA, NA, NA),
                  CTR5 = c(NA, NA, NA, NA, NA),
                  CTR6 = c(NA, NA, NA, NA, NA))


ID CTR1    CTR2    CTR3 CTR4 CTR5 CTR6
1  England China   USA
2  England China   USA
3  England China   USA
4  China   England USA
5  Sweden

仍然是基于以下四个条件创建共现矩阵(现在)的目标:

  1. 不考虑ID /行中没有其他观察值的单个观察值,即仅将一个国家/地区的行一次计为0。

  2. 组合/同现应计为1。

  3. 处于组合状态也将被视为自组合(美国-美国),即,将值分配为1。

  4. 没有按行/ ID分配给组合的值超过1。

理想结果

         China   England   USA   Sweden

China    4        4         4      0

England  4        4         4      0        

USA      4        4         4      0

Sweden   0        0         0      0

*我已使用here中的代码删除了所有非唯一的观察结果。


原始帖子

假设我的数据集的列数少两位(某些NA /空),并且行数超过100.000,由以下示例数据帧表示

df <- data.frame(ID = c(1,2,3,4,5), 
                  CTR1 = c("England", "England", "England", "China", "England"),
                  CTR2 = c("England", "China", "China", "England", NA),
                  CTR3 = c("England", "China", "China", "England", NA),
                  CTR4 = c("China", "USA", "USA", "China", NA),
                  CTR5 = c("USA", "England", "USA", "USA", NA),
                  CTR6 = c("England", "China", "USA", "England", NA))


df

ID   CTR1    CTR2    CTR3    CTR4   CTR5    CTR6         
1    England England England China  USA     England 
2    England China   China   USA    England China
3    England China   China   USA    USA     USA  
4    China   England England China  USA     England
5    England 

并且我想对ID /行的同现进行计数,以获得一个共现矩阵,该矩阵仅对ID /行的同现进行总和一次,这意味着不会将超过1的值分配给组合(即为不存在行内频率和顺序的同现指定一个值1,为不共现/ ID /行组合不指定为0。

1 England-England-England => 1
2 England-England => 1
3 England-China => 1
4 England- => 0

[另一个重要方面是关于连续出现一次但与其他观察值相结合的观察值的计数,例如美国在第1行中。他们应该为自己的同现获得1的值(因为即使不是与他们自己在一起,它们也处于结合状态),以便USA-USA的结合也得到1的赋值。

1    England England England China  USA  England 
USA-USA => 1
China-China => 1
USA-China => 1
England-England => 1
England-USA => 1
England-China => 1

由于行/ ID的组合,行数不应大于1,因此得出:

        China   England   USA 

China    1        1         1        

England  1        1         1        

USA      1        1         1

这应基于示例数据帧得出以下结果,其中基于每个组合至少出现在四行中并且每个字符串是原始组合的一部分的事实为每个组合分配值4数据框:

         China   England   USA 

China    4        4         4        

England  4        4         4        

USA      4        4         4

所以有五个条件可以计数:

  1. 不考虑按ID /行没有附加观察值的单个观察值,即不计入一次只有一个国家的行。
  2. 组合应计为1。
  3. 进行多次观察并不能为互动带来更高的价值,即同一国家的多次观察都没有关系。
  4. 组合在一起(即使在同一国家/地区没有连续出现两次的情况下,也会计为自组合,即分配的值为1。
  5. 没有按行/ ID分配给组合的值超过1。
  6. 我已经尝试通过使用dplyrdata.tablebase aggregateplyr[1]和[]中的[2][3][4][5]调整代码来实现此目的C0],但由于我不在乎连续的顺序,但我也不想汇总连续的所有组合,因此到目前为止,我还没有得到理想的结果。

我是R的新手。非常感谢您的帮助。

更新感谢@jazzurro的回答。这使我意识到重复项可能会使事情复杂化。我希望仅保留唯一的值/行可以简化任务。* df

r dplyr data.table combinations find-occurrences
2个回答
1
投票

DATA


0
投票

这里是使用# Transform the data to long-format data. Remove rows that have zero character (i.e, "") or NA. melt(setDT(df), id.vars = "ID", measure = patterns("^CTR"))[nchar(value) > 0 & complete.cases(value)] -> foo # Get distinct value (country) in each ID group (each row) unique(foo, by = c("ID", "value")) -> foo2 # https://stackoverflow.com/questions/13281303/creating-co-occurrence-matrix # Seeing this question, you want to create a matrix with crossprod(). crossprod(table(foo2[, c(1,3)])) -> mymat # Finally, you need to change diagonal values. If a value is equal to one, # change it to zero. Otherwise, keep the original value. diag(mymat) <- ifelse(diag(mymat) <= 1, 0, mymat) #value #value China England Sweden USA #China 4 4 0 4 #England 4 4 0 4 #Sweden 0 0 0 0 #USA 4 4 0 4 的选项:

© www.soinside.com 2019 - 2024. All rights reserved.