如何通过ID /行对同现/组合进行一次计数并将其转换为R中的矩阵?

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

原始内容(请参见下面的更新

假设我的数据集的列数少两位(某些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的帮助。这使我意识到重复项可能使事情复杂化。我希望仅按行保留唯一值可以简化任务,以便通过应用[6]中的代码来使示例数据框看起来像这样。

here

仅满足三个条件:

  1. 不考虑按ID /行没有附加观察值的单个观察值,即不计算一次仅具有一个国家的行。

  2. 组合应计为1。

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

  • 原始(请参阅下面的更新),假设我的数据集的列数较低(一些NA /空),并且行数超过100.000,由以下示例数据帧df表示

    < [
    让我丢下我现在所得到的,因为时间在我身边。经过以上讨论,我想您要问的是这个。对于每一行,您要标识唯一的国家/地区名称。例如,让我们进行第1行。您有英格兰(4次),美国(一次)和中国(一次)。您想忽略重复并选择唯一的国家/地区。因此,您在第一行中有三个国家。我认为这已经足够了,尽管您似乎想在每一行中找到国家的所有可能组合。)

    数据和代码

    我修改了您的数据,以便数据可以代表您的实际情况。

    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("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 England

    如果您想考虑每一行并查找唯一国家的所有可能组合,并计算每对出现在数据集中的次数,则可以执行以下操作。我仍然认为,鉴于我们在评论中所传达的内容,USA-USA组合在数据集中不会出现四次。由于时间限制,我无法继续前进。如果您需要进一步的帮助,我明天尝试找时间。

    # ID CTR1 CTR2 CTR3 CTR4 CTR5 CTR6 #1: 1 England England England China USA England #2: 2 England China China USA England China #3: 3 England China China USA USA USA #4: 4 China England England China USA England #5: 5 Sweden <NA> <NA> <NA> <NA> # Transform the data to long-format data. Remove rows that have # zero character (i.e, "") or NA. For each group defined by ID, # remove the only row if the total number of the rows is 1 for the group. melt(setDT(df), id.vars = "ID", measure = patterns("^CTR"))[ nchar(value) > 0 & complete.cases(value)][,.SD[.N > 1], by = ID] -> foo # Get unique country names for each ID group. Finally, count how many rows each country # appear. unique(foo, by = c("ID", "value"))[, .(total_rows = .N), by = value] # value total_rows #1: England 4 #2: China 4 #3: USA 4

    r dplyr data.table combinations find-occurrences
    1个回答
    1
    投票
    让我丢下我现在所得到的,因为时间在我身边。经过以上讨论,我想您要问的是这个。对于每一行,您要标识唯一的国家/地区名称。例如,让我们进行第1行。您有英格兰(4次),美国(一次)和中国(一次)。您想忽略重复并选择唯一的国家/地区。因此,您在第一行中有三个国家。我认为这已经足够了,尽管您似乎想在每一行中找到国家的所有可能组合。)

    数据和代码

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