【问题标题】:Divide rows by conditional row sums除以条件行总和
【发布时间】:2019-10-15 22:58:06
【问题描述】:

考虑以下矩阵:

m <- cbind(c("r1","r2","r3","r4","r1","r2","r3","r4"),c(3,2,5,2,5,2,6,4),c(4,3,5,3,7,4,6,7))

对于每一行,我想将行总和与其条件行总和相除。也就是说,对于名称为“r1”的所有行,我想将它们的行总和除以名称为“r1”的所有行的行总和。因此,对于“(3+4)/(3+4+5+7)”的第一行。

“r2”、“r3”和“r3”也是如此。所以以第二行为例,计算为“(2+3)/(2+3+2+4)”。

我如何在 R 中做到这一点?

【问题讨论】:

  • 为什么要把它当作矩阵?它强迫一切来塑造角色
  • 是data.frame更好吗?
  • 好吧,一个矩阵中不能有多个类型,所以你需要把它变成一个数据框

标签: r division


【解决方案1】:

这是我们整理您的数据后的基本 R 解决方案,

df <- data.frame(m, stringsAsFactors = FALSE)
df[-1] <- lapply(df[-1], as.numeric)
df$new <- df$X2 + df$X3

with(df, ave(new, X1, FUN = function(i)i / sum(i)))
#[1] 0.3684211 0.4545455 0.4545455 0.3125000 0.6315789 0.5454545 0.5454545 0.6875000

【讨论】:

  • ave(rowSums(df[,-1]), df$X1, FUN = function(i) i / sum(i))
【解决方案2】:

首先,将数据创建为 data.frame 而不是矩阵,这样数字列就不会被强制转换为字符。 (如果您已经创建了矩阵,也可以使用 sotos 答案中的前两行从矩阵转换为 data.frame)

df <- data.frame(row_id = c("r1","r2","r3","r4","r1","r2","r3","r4"),
                v1 = c(3,2,5,2,5,2,6,4),
                v2 = c(4,3,5,3,7,4,6,7))

现在,如果您使用 setDT 将 data.frame 转换为 data.table,您可以使用 data.table 分组来执行此操作(by = row_id 设置组)

library(data.table)
setDT(df)

df[, ratio := (v1 + v2)/sum(v1 + v2), by = row_id]

df
#    row_id v1 v2     ratio
# 1:     r1  3  4 0.3684211
# 2:     r2  2  3 0.4545455
# 3:     r3  5  5 0.4545455
# 4:     r4  2  3 0.3125000
# 5:     r1  5  7 0.6315789
# 6:     r2  2  4 0.5454545
# 7:     r3  6  6 0.5454545
# 8:     r4  4  7 0.6875000

【讨论】:

    【解决方案3】:
    m <- cbind(c("r1","r2","r3","r4","r1","r2","r3","r4"),c(3,2,5,2,5,2,6,4),c(4,3,5,3,7,4,6,7))
    
    require(dplyr)
    
    
    
    m %>%  as_tibble %>% 
      mutate(V4 = as.numeric(V2) + as.numeric(V3)) %>% 
      group_by(V1) %>% 
      mutate(conditional_sum = sum(V4)) %>%  
      ungroup %>% 
      mutate(calculation = V4/conditional_sum) 
    
    # A tibble: 8 x 6
    # V1    V2    V3       V4 conditional_sum calculation
    # <chr> <chr> <chr> <dbl>           <dbl>       <dbl>
    # 1 r1    3     4         7              19       0.368
    # 2 r2    2     3         5              11       0.455
    # 3 r3    5     5        10              22       0.455
    # 4 r4    2     3         5              16       0.312
    # 5 r1    5     7        12              19       0.632
    # 6 r2    2     4         6              11       0.545
    # 7 r3    6     6        12              22       0.545
    # 8 r4    4     7        11              16       0.688
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 2021-08-31
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      相关资源
      最近更新 更多