如何获得特定值的频率?

How to get the frequency of specific values?

我有一个包含 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) 有什么帮助。

有谁知道解决这个问题的方法吗?

谢谢

我们可以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)

一个dplyrpurrr选项可以是:

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(.)))

这是一个基本的 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