我写了一些代码来创建一个列名称表,以及每个列中有NA
个值的计数。现在,我想更改此代码以计算列中存在多少个空字符串""
。
以下是一些通用数据:
d <- data.frame("ID" = c("A", "B", "", "C"),
"VAL" = c(1, NA, 2, 3),
"ORDER" = c(0, 3, 6, 7),
"MARKET" = c("ENT", "HOUSE", "RETAIL", ""))
这是我的代码,用于生成一个表格,列出各列中有多少NA
。
注意: 它仅将包含至少1个NA
的列放在表中,并且此 是有意的。这是因为数据中有很多列,我希望表格仅反映那些缺少值的列-我关心的列。
代码:
c_names <- names(d)
k <- 0
cont_NA <- NA
for (i in 1:(dim(d)[2])) {
z <- unique(is.na(d[, i]))
if(length(z) == 2){
if(!is.na(cont_NA)){
cont_NA <- c(cont_NA, c_names[i])
}else{
cont_NA <- c_names[i]
}
}
}
rm(i, k, z)
missing <- data.frame("Column" = NA,
"Missing_Values" = NA)
for(p in 1:length(cont_NA)){
s <- sum(is.na(d[, c_names %in% cont_NA[p]]))
missing[p, 1] <- cont_NA[p]
missing[p, 2] <- s
}
rm(p, s, cont_NA)
missing
我的问题是,除了计数""
之外,我如何转换此代码以执行相同的操作?在上面的代码中,我使用的是函数is.na
,但是我没有意识到要计算空字符串的函数。
上述代码的示例输出为:
Column Missing_Values
VAL 1
我的问题的样本输出如下:
Column Missing_Values
ID 1
MARKET 1
答案 0 :(得分:2)
不要用于循环。查看“应用”功能。它将使您的生活变得更加轻松。
# Sum up empty string per column over all columns using the apply function
tmp <- apply(d,2,function(x) sum(x=='',na.rm=TRUE))
# Create new dataframe of the results
res <- data.frame('Column'=names(tmp), 'Missing_Values'=as.numeric(tmp))
# Display results with nonzero values
res[res$Missing_Values!=0,]
答案 1 :(得分:2)
这是dplyr
和tidyr
的解决方案。首先,我创建数据框。
d <- data.frame("ID" = c("A", "B", "", "C"),
"VAL" = c(1, NA, 2, 3),
"ORDER" = c(0, 3, 6, 7),
"MARKET" = c("ENT", "HOUSE", "RETAIL", ""))
然后,我检查空字符串并求和所有实例。我gather
从宽到长格式的所有列,并过滤出零个空字符串的那些列。
d %>%
summarise_all(funs(sum(. == "", na.rm = TRUE))) %>%
gather(Column, Missing_Values) %>%
filter(Missing_Values > 0)
给出,
# Column Missing_Values
# 1 ID 1
# 2 MARKET 1
答案 2 :(得分:2)
怎么样
n <- colSums(d == "", na.rm = TRUE)
rev(stack(n[n > 0]))
# ind values
# 1 ID 1
# 2 MARKET 1