#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. Ого, Маркус, это было быстро. Отличное решение, спасибо.