Разделите строки на условные суммы строк - PullRequest
1 голос
/ 15 октября 2019

Рассмотрим следующую матрицу:

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?

Ответы [ 3 ]

3 голосов
/ 15 октября 2019

Вот базовое решение 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
2 голосов
/ 15 октября 2019

Во-первых, создайте ваши данные как 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))

Теперь, если вы преобразуете свой data.frame в data.tableс setDT вы можете выполнить эту операцию, используя группировку 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
1 голос
/ 15 октября 2019
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
...