Как составить сводную таблицу? - PullRequest
1 голос
/ 19 июня 2020

Предположим, у меня есть следующая таблица с именем df.

A; B
A; B
B; C; D
C; D; E; F

Вес для каждого элемента строки вычисляется как: wt[i] <- 1/lengths(str_split(df[1],";")). В идеале , веса приведенной выше таблицы, прикрепленные к каждому элементу, выглядят следующим образом.

0.5*A; 0.5*B
0.5*A; 0.5*B
0.333*B; 0.333*C; 0.333*D
0.25*C; 0.25*D; 0.25*E; 0.25*F

Итак, я намерен создать таблицу, в которой частоты представляют собой сумму весов . Мне нужен следующий результат:

A     B     C     D      E     F
1  1.333 0.583  0.583  0.25  0.25

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 19 июня 2020

Вот вариант в base R. После разделения первого столбца на ;, за которым следует ноль или более пробелов (\\s*), получите lengths из list и найдите sum, используя tapply

lst1 <- strsplit(df[[1]], ";\\s*")
l1 <- lengths(lst1)
tapply(rep(1/l1, l1), unlist(lst1), sum)
#        A         B         C         D         E         F 
#1.0000000 1.3333333 0.5833333 0.5833333 0.2500000 0.2500000 

Или в tidyverse, мы можем использовать separate_rows, чтобы разделить столбец, а затем выполнить группировку по summarise

library(tibble)
library(dplyr)
library(tidyr)
df %>%
    mutate(rn = row_number()) %>%
    separate_rows(v1) %>%
    add_count(rn) %>% 
    mutate(n = 1/n) %>% 
    group_by(v1) %>% 
    summarise(n = sum(n))
# A tibble: 6 x 2
#  v1        n
#  <chr> <dbl>
#1 A     1    
#2 B     1.33 
#3 C     0.583
#4 D     0.583
#5 E     0.25 
#6 F     0.25 

data

df <- structure(list(v1 = c("A; B", "A; B", "B; C; D", "C; D; E; F"
)), class = "data.frame", row.names = c(NA, -4L))
...