Как создать таблицу с переменной частотой в R, если не все значения присутствуют во всех столбцах? - PullRequest
1 голос
/ 14 марта 2019

Я бы хотел создать таблицу частот, например, в R:

df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,9,8,7))
apply(df, 2, table)

# outputs:  
#   aa bb cc
# 7  1  1  2
# 8  2  1  1
# 9  1  2  1

Но, если один из столбцов df будет иметь счетчик 0 (например, если мы изменим вышеприведенноетак что df$cc не имеет 9) вместо красивого фрейма данных мы получим список.

# example that gives a list
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,8,8,7))
apply(df, 2, table)

Какой простой способ сделать нечто подобное, что гарантирует вывод фрейма данных независимо от количества?

Я могу представить несколько решений, которые кажутся грязными или взломанными, например, это дает желаемый результат:

# example of a messy but correct solution
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,8,8,7))
apply(df, 2, function(x) summary(factor(x, levels = unique(unlist(df)))))

Есть ли более чистый способ сделать это?

1 Ответ

2 голосов
/ 14 марта 2019

Я продолжу и отвечу, хотя я все еще возражаю против отсутствия критериев. Если мы считаем «аккуратным» противоположность «грязного», то сначала нужно привести в порядок входные данные в длинном формате. Тогда мы можем сделать двустороннюю table:

library(tidyr)
df %>% gather %>%
  with(table(value, key))
#      key
# value aa bb cc
#     7  1  1  2
#     8  2  1  2
#     9  1  2  0

Спасибо Маркусу за базовую версию R:

table(stack(df))
#       ind
# values aa bb cc
#      7  1  1  2
#      8  2  1  2
#      9  1  2  0
...