считая вхождения в столбцах df с r - PullRequest
4 голосов
/ 16 апреля 2019

Мне нужно сосчитать 3 значения для каждого столбца в df.Значения 1-3, в столбцах также есть NA.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 Ответ

3 голосов
/ 16 апреля 2019

Вы можете использовать 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...