使用2个数据帧列创建矩阵,同时将其他两个列相乘

时间:2018-01-06 00:11:15

标签: r for-loop foreach

我希望你能帮我解决一段时间困扰我的问题。

我有一个包含几百万行的数据框,如下所示: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的cou​​nt.i * count.j的总和。
  • id中的重复表示V1和/或V2中的重复,这是所有需要的信息。我不想通过乘法使用count.i和count.j来衡量我的测量值。例如。当id = 7时,发生了4种可能性,即20000-E,20000-F,44044-E& 44044-F,总重量为0.25。
  • 我尝试了foreach功能。然而,无法让它工作

帮助会非常渺茫!

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

1 个答案:

答案 0 :(得分:0)

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

适应您的新解释。