【问题标题】:create matrix using 2 dataframe columns, while multiplying two others使用 2 个数据框列创建矩阵,同时将另外两个相乘
【发布时间】:2018-06-15 19:42:39
【问题描述】:

我希望你能帮助我解决一个让我卡住了一段时间的问题。

我有一个包含几百万行的数据框,如下所示:df

 id       V1=i     count.i      V2=j      count.j  
  1      10000      1          A          1
  2      20000      1          B          .33
  2      20000      1          C          .33
  2      20000      1          D          .33
  3      19482      1          E          1
  4      10000      .5         A          1                   
  4      20000      .5         A          1
  5      34556      1          E          1
  6      10101      1          A          .5
  6      10101      1          B          .5
  7      20000     .5          E          .5
  7      20000     .5          F          .5
  7      44044     .5          E          .5
  7      44044     .5          F          .5
  • 我想把它变成一个矩阵(最好是稀疏的),看起来像这样:

矩阵

                 A,     B,     C,     D,     E,     F,     G,     ,...,  J
     10000      1.5     x      x      x      x       x     x 
     10101       .5     .5     x      x      x       x     x 
     19482       x      x      x      x      1       x     x 
     20000       0.5   .33   .33    .33     .25     .25   x  
     34556       x      x      x      x      1       x     x 
     44044       x      x      x      x      x       x     x      
     ,.., I  
  • V1 是组成行的序数类,V2 是组成列的序数类。在此示例中,存在 49 种可能性。
  • 其中每个相应单元格中的值是该观察 i-j 的 count.i * count.j 的总和。
  • id 中的重复项表示 V1 和/或 V2 中的重复项,这是所有需要的信息。我不想通过乘法使用 count.i 和 count.j 来加权我的测量值。例如。当 id=7 时,出现了 4 种可能性,分别是 20000-E、20000-F、44044-E 和 44044-F,它们的权重分别为 0.25。
  • 我尝试了 foreach 函数。但是,无法让它工作

非常感谢您的帮助!

编辑:我已将示例更改为更清晰和具有代表性

【问题讨论】:

  • 您的意思是 V1$1 到 V1$7 和 V2$A 到 V2$F?同时提供您已经尝试过的代码。

标签: r for-loop foreach


【解决方案1】:
data<-read.table(textConnection(
"id       V1     count.i      V2      count.j  
1      10000      1          A          1
2      20000      1          B          .33
2      20000      1          C          .33
2      20000      1          D          .33
3      19482      1          E          1
4      22222      1          F          .5
4      22222      1          G          .5
5      34556      1          E          1
6      10101      1          A          .5
6      10101      1          B          .5
7      20000     .5          B          .5
7      20000     .5          F          .5
7      44044     .5          E          .5
7      44044     .5          F          .5"
), header=TRUE)

  require(tidyverse)
  data %>% mutate(ij=count.i*count.j) %>% 
  select(-count.i,-count.j) %>%
  dcast(id+V1~V2,value.var="ij") %>%
  select(-id) %>%
  as.matrix()
        V1   A    B    C    D    E    F   G
[1,] 10000 1.0   NA   NA   NA   NA   NA  NA
[2,] 20000  NA 0.33 0.33 0.33   NA   NA  NA
[3,] 19482  NA   NA   NA   NA 1.00   NA  NA
[4,] 22222  NA   NA   NA   NA   NA 0.50 0.5
[5,] 34556  NA   NA   NA   NA 1.00   NA  NA
[6,] 10101 0.5 0.50   NA   NA   NA   NA  NA
[7,] 20000  NA 0.25   NA   NA   NA 0.25  NA
[8,] 44044  NA   NA   NA   NA 0.25 0.25  NA

适应了你的新解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2012-04-27
    相关资源
    最近更新 更多