根据r

时间:2018-12-06 17:26:42

标签: r count na

我写了一些代码来创建一个列名称表,以及每个列中有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

3 个答案:

答案 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)

这是dplyrtidyr的解决方案。首先,我创建数据框。

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