подсчет вхождений в столбцы df с r

#r #dataframe #count

#r #фрейм данных #подсчет

Вопрос:

Мне нужно подсчитать вхождения 3 значений для каждого столбца в df. Значения равны 1-3, и в столбцах также есть NAS. df выглядит следующим образом:

         a   b   c   d   e   f   g   h
1001    2   NA  1   NA  NA  NA  NA  NA
1075    2   NA  NA  NA  NA  NA  NA  NA
1076    NA  NA  NA  NA  NA  NA  NA  NA
1077    NA  2   NA  NA  NA  NA  NA  NA
1078    3   3   NA  3   NA  NA  NA  NA
1079    NA  NA  NA  NA  NA  NA  NA  NA
1080    1   NA  NA  NA  NA  NA  NA  3
1081    NA  NA  NA  NA  NA  NA  NA  NA
1082    3   NA  1   NA  2   2   NA  1
1083    NA  NA  3   NA  NA  NA  1   NA
1084    1   3   NA  NA  1   NA  3   NA
1085    NA  NA  NA  NA  NA  NA  NA  NA
1086    NA  NA  NA  NA  NA  NA  NA  NA
1087    3   1   NA  NA  NA  NA  NA  3
 

результат должен выглядеть следующим образом.

 values  a   b   c   d   e   f   g   h
1       2   1   2   0   1   0   1   1
2       2   1   0   0   1   1   0   0
3       3   2   1   1   0   0   1   1
 

Ответ №1:

Вы можете использовать stack и table

 table(stack(dat))
#      ind
#values a b c d e f g h
#     1 2 1 2 0 1 0 1 1
#     2 2 1 0 0 1 1 0 0
#     3 3 2 1 1 0 0 1 2
 

Используя tidyr dplyr функции и, которые вы могли бы сделать

 library(tidyr); library(dplyr)
gather(dat, na.rm = TRUE) %>% 
  count(value, key) %>% 
  spread(key, n, fill = 0)
 

данные

 dat <- structure(list(a = c(2L, 2L, NA, NA, 3L, NA, 1L, NA, 3L, NA, 
1L, NA, NA, 3L), b = c(NA, NA, NA, 2L, 3L, NA, NA, NA, NA, NA, 
3L, NA, NA, 1L), c = c(1L, NA, NA, NA, NA, NA, NA, NA, 1L, 3L, 
NA, NA, NA, NA), d = c(NA, NA, NA, NA, 3L, NA, NA, NA, NA, NA, 
NA, NA, NA, NA), e = c(NA, NA, NA, NA, NA, NA, NA, NA, 2L, NA, 
1L, NA, NA, NA), f = c(NA, NA, NA, NA, NA, NA, NA, NA, 2L, NA, 
NA, NA, NA, NA), g = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 1L, 
3L, NA, NA, NA), h = c(NA, NA, NA, NA, NA, NA, 3L, NA, 1L, NA, 
NA, NA, NA, 3L)), .Names = c("a", "b", "c", "d", "e", "f", "g", 
"h"), class = "data.frame", row.names = c("1001", "1075", "1076", 
"1077", "1078", "1079", "1080", "1081", "1082", "1083", "1084", 
"1085", "1086", "1087"))
 

Комментарии:

1. Ого, Маркус, это было быстро. Отличное решение, спасибо.