【问题标题】:Populate matrix from a data frame via a loop [duplicate]通过循环从数据框中填充矩阵[重复]
【发布时间】:2020-11-06 01:15:34
【问题描述】:

基于数据集(参见“输入”),我想创建以下矩阵:

> A
   BM CC  E  F  I  S CnC D
BR  1  2  3  4  5  6 NA NA
MX  7  8 11 12 13 14  9 10

输入:

cntry <- c("BR", "BR", "BR", "BR", "BR", "BR", "MX", "MX", "MX","MX", "MX", "MX", "MX", "MX")
sector <- c("BM", "CC", "E", "F", "I", "S","BM", "CC", "CnC", "D", "E", "F", "I", "S")
ratio <- seq(1, 14)
data <- data.frame(cbind(cntry, sector, ratio)
> data
   cntry sector ratio
1     BR     BM     1
2     BR     CC     2
3     BR      E     3
4     BR      F     4
5     BR      I     5
6     BR      S     6
7     MX     BM     7
8     MX     CC     8
9     MX    CnC     9
10    MX      D    10
11    MX      E    11
12    MX      F    12
13    MX      I    13
14    MX      S    14

我尝试了以下方法,但无法继续:

cntry_n <- nrow(cntry) # number of countries (here: 2), duplicates were removed
sector_n <- nrow(sector) # number of sectors(here: 8), duplicates were removed

A <- matrix(0, cntry_n, sector_n) # Zero was used as a default
rownames(A) <- cntry 
colnames(A) <- sector

> A
   BM CC  E  F  I  S CnC D
BR  0  0  0  0  0  0   0 0
MX  0  0  0  0  0  0   0 0

for(m in 1:cntry_n){
  for(n in 1:sector_n){
    A[m, n] = ????
  }
}

有没有有效的方法来解决这样的问题?

非常感谢任何帮助!

【问题讨论】:

    标签: r loops dataframe matrix


    【解决方案1】:

    你可以试试:

    library(tidyr)
    data2 <- pivot_wider(data,names_from = sector,values_from = ratio)
    
    # A tibble: 2 x 9
      cntry BM    CC    E     F     I     S     CnC   D    
      <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
    1 BR    1     2     3     4     5     6     <NA>  <NA> 
    2 MX    7     8     11    12    13    14    9     10  
    

    【讨论】:

    • @MartinGal 是的,你知道为什么会这样吗?我以为我做错了什么。
    • @Duck 我不知道。也许有人认为“嗯......这不是一个矩阵,所以我投反对票!!!111”或者那个人不喜欢tidyr 解决方案。在我看来,该解决方案回答了 OP 的问题。
    • @MartinGal 是的,非常奇怪的行为!
    【解决方案2】:

    如果你想要一个table 对象,你可以使用xtabs()

    tab <- xtabs(ratio ~ cntry + sector, data)
    
    #      sector
    # cntry BM CC CnC  D  E  F  I  S
    #    BR  1  2   0  0  3  4  5  6
    #    MX  7  8   9 10 11 12 13 14
    

    在使用上面的代码之前,请确保ratio 是数字。


    要将表格转换为data.frame,您可以使用as.data.frame.matrix()

    as.data.frame.matrix(tab)
    
    #    BM CC CnC  D  E  F  I  S
    # BR  1  2   0  0  3  4  5  6
    # MX  7  8   9 10 11 12 13 14
    

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2021-07-11
      • 2013-01-19
      • 2012-06-13
      相关资源
      最近更新 更多