计算数据帧中变量的完整/未缺失值的分数,以便以长格式输出

时间:2017-11-28 14:07:40

标签: r dplyr tidyr

我的数据框(df1)包含四个变量abcd

我想获得数据框中每个变量的完整性(!is.na(x))。我希望输出格式为长格式(df2)。

问题在于我无法使nrow()部分代码工作(因此我不知道它是否全局工作)。或者有一种dplyr + tidyr的做法吗?

非常感谢任何帮助。

起点(df1):

df1 <- data.frame(a=c(1,2,3,NA),b=c(1,2,NA,NA),c=c(1,2,3,4),d=c(NA,NA,NA,NA),stringsAsFactors = TRUE)

当前代码:

sapply(df1, function(x) sum(!is.na(df1$x)) / nrow(df1$x))

期望的结果(df2):

df2 <- data.frame(nameofvar=c("a","b","c","d"),completeness=c(75,50,100,0))

5 个答案:

答案 0 :(得分:3)

如果您希望答案是长格式,请按以下步骤操作:

df2 = df1 %>%
    gather(NameOfVar, Value) %>%
    group_by(NameOfVar) %>%
    summarize(Completeness = mean(! is.na(Value)) * 100)

至于你的(基本R)代码无效的原因:

sapply在data.frame上时,函数的参数(x)就是列数据本身。因此,您需要使用df1$x而不是x,而不是nrow,而不是length,因为现在需要使用x,因为每列都是$ x向量

1 此外,df1$x - 使用变量进行子集化从不起作用,  因此,即使df1[[x]]是列名/索引,<localRepository>{your-new-path}</localRepository>也无法正常工作。您必须改为使用{{1}}。

答案 1 :(得分:1)

尝试purrr的{​​{1}}个包裹。

tidyverse

答案 2 :(得分:1)

data.table

dt1 <- as.data.table(df1)
dt1[, sapply(.SD, function(x) {sum(!is.na(x)) / .N}), .SD = names(dt1)] 

答案 3 :(得分:1)

或者非常简单地使用基础R:

colSums(!is.na(df1))/ ncol(df1) * 100

答案 4 :(得分:0)

仅使用dplyr包:

library(dplyr)

df1 <- data.frame(a=c(1,2,3,NA),
                  b=c(1,2,NA,NA),
                  c=c(1,2,3,4),
                  d=c(NA,NA,NA,NA),
                  stringsAsFactors = TRUE)

# get percentage of non NA values
df1 %>% summarise_all(function(x) mean(! is.na(x)))

#      a   b c d
# 1 0.75 0.5 1 0