Считать различно среди строк и совокупности - PullRequest
2 голосов
/ 06 ноября 2019

У меня есть набор данных, как показано ниже:

data <- tribble(
  ~top_1, ~top_2, ~top_3,
  "A",     "B",    "C",
  "B",     "B",    "B",   
  "C",     "B",    "C",
  "A",     "B",    "B",
  "A",     "A",    "A",
  "B",     "B",    "A",
  "C",     "A",    "C",
  "A",     "A",    "A",
  "A",     "C",    "B",
  "B",     "B",    "C",
)

А теперь я хочу подсчитать отдельные строки для каждого столбца и получить новый набор данных примерно так:

new_data <- tribble(
  ~product, ~top_1, ~top_2, ~top_3,
     "A",    .50,    .30,     .30,
     "B",    .30,    .60,     .30,
     "C",    .20,    .10,     .40,
)

Не могли бы вы помочь мне создать эти данные?

Ответы [ 3 ]

5 голосов
/ 06 ноября 2019
lvl = unique(unlist(data))
sapply(data, function(x) prop.table(table(factor(x, lvl))))
#  top_1 top_2 top_3
#A   0.5   0.3   0.3
#B   0.3   0.6   0.3
#C   0.2   0.1   0.4
4 голосов
/ 06 ноября 2019

Один base R параметр может быть:

table(stack(data))/nrow(data)

values top_1 top_2 top_3
     A   0.5   0.3   0.3
     B   0.3   0.6   0.3
     C   0.2   0.1   0.4

И если вы хотите его как data.frame:

as.data.frame.matrix(table(stack(data))/nrow(data))
2 голосов
/ 06 ноября 2019

Вот один вариант, в котором мы gather переводим в «длинный» формат, получаем count и преобразуем в «широкий» формат с помощью pivot_wider

library(dplyr)
library(tidyr)
data %>%
   gather %>% 
   group_by_all %>% 
   count %>%
   group_by(key) %>%
   mutate(n = n/sum(n)) %>% 
   pivot_wider( names_from = key, values_from = n)
# A tibble: 3 x 4
# Groups:   value [3]
#  value top_1 top_2 top_3
#  <chr> <dbl> <dbl> <dbl>
#1 A       0.5   0.3   0.3
#2 B       0.3   0.6   0.3
#3 C       0.2   0.1   0.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...