Как получить частоту заданных значений c? - PullRequest
1 голос
/ 21 февраля 2020

У меня большой набор данных из 1000 строк и 10000 столбцов. Я приведу короткий пример со следующим кодом:

V1 = c(1,2,1,1,NA,1,0,2,2,1,0)
V2 = c(0,2,NA,2,1,2,0,1,NA,0,0)
V3 = c(3,1,1,1,NA,1,0,2,2,1,2)
V4 = c(1,2,NA,1,0,2,0,2,NA,2,0)
datos =data.frame(cbind(V1,V2,V3,V4))

Каждый из моих столбцов имеет значения = "0", "1" или "2". Мне нужно получить частоту «0» и «1» в каждом столбце. Обратите внимание, что набор данных также имеет значения «NA», которые мне не нужно принимать во внимание для оценки частот.

Например, для V1 частота «0» равна = 2/10 = 0,2, а частота «1» равна = 5/10 = 0,5. Таким образом, сумма составляет 0,2 + 0,5 = 0,7.

Я думаю, что apply(datos, 2, x) может помочь, но я не уверен, как может быть function (x).

Кто-нибудь знает способ решить эту проблему?

Спасибо

Ответы [ 3 ]

3 голосов
/ 21 февраля 2020

Мы можем replace значения, отличные от 0 или 1, до NA, получить частоту с table и преобразовать в пропорции с prop.table

sapply(datos, function(x) prop.table(table(replace(x, !x %in% 0:1, NA))))

Если нам нужно рассмотреть всю длину то есть количество строк исходного набора данных

sapply(datos, function(x) table(replace(x, !x %in% 0:1, NA)))/nrow(datos)
1 голос
/ 21 февраля 2020

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

map(.x = list(zeros = 0, ones = 1), 
    ~ summarise_all(datos, ~ sum(. == !!.x, na.rm = TRUE)/length(na.omit(.))))

$zeros
   V1        V2  V3        V4
1 0.2 0.4444444 0.1 0.3333333

$ones
   V1        V2  V3        V4
1 0.5 0.2222222 0.5 0.2222222

Если вы хотите также комбинированное значение для двух:

map(.x = list(zeros = 0, ones = 1), 
    ~ summarise_all(datos, ~ sum(. == !!.x, na.rm = TRUE)/length(na.omit(.)))) %>%
 reduce(`+`)

   V1        V2  V3        V4
1 0.7 0.6666667 0.6 0.5555556

Или просто dplyr если вы ищете комбинированные значения:

datos %>%
 summarise_all(~ sum(. %in% c(0, 1), na.rm = TRUE)/length(na.omit(.)))
0 голосов
/ 22 февраля 2020

Вот базовое решение R

res <- Map(function(x) sum(head(prop.table(table(na.omit(x))),2)),datos)

такое, что

> res
$V1
[1] 0.7

$V2
[1] 0.6666667

$V3
[1] 0.6

$V4
[1] 0.5555556
...