Создайте таблицу пустых ("") значений из data.frame в r - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть некоторый код, который я написал для создания таблицы имен столбцов и подсчета количества значений в каждом столбце 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 голосов
/ 06 декабря 2018

Вот решение 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
0 голосов
/ 06 декабря 2018

Как насчет

n <- colSums(d == "", na.rm = TRUE)
rev(stack(n[n > 0]))
#      ind values
# 1     ID      1
# 2 MARKET      1
0 голосов
/ 06 декабря 2018

Не используйте для петель.Посмотрите на функцию «Применить».Это сделает вашу жизнь намного проще.

# 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,] 
...