我的数据框(df1
)包含四个变量a
,b
,c
和d
。
我想获得数据框中每个变量的完整性(!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))
答案 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