【问题标题】:R: Remove multiple empty columns of character variablesR:删除字符变量的多个空列
【发布时间】:2013-07-16 09:21:26
【问题描述】:

我有一个数据框,其中所有变量都是字符类型。许多列是完全空的,即只有变量标题在那里,但没有值。有没有办法将空列子集化?

【问题讨论】:

  • 顺便说一句,空,你是指NA还是""

标签: r is-empty isnullorempty


【解决方案1】:

如果您的空列是 真的 空字符列,则类似以下内容应该可以工作。如果您的“空”字符列包含空格,则需要对其进行修改。

样本数据:

mydf <- data.frame(
  A = c("a", "b"),
  B = c("y", ""),
  C = c("", ""),
  D = c("", ""),
  E = c("", "z")
)
mydf
#   A B C D E
# 1 a y      
# 2 b       z

识别并删除“空”列。

mydf[!sapply(mydf, function(x) all(x == ""))]
#   A B E
# 1 a y  
# 2 b   z

或者,按照@Roland 的建议:

> mydf[, colSums(mydf != "") != 0]
  A B E
1 a y  
2 b   z

【讨论】:

  • 我只是建议扩展条件以防有 NA 值而不是“”:all(x == "" || is.na(x))。但它会失去一点优雅:)
  • mydf[,colSums(mydf!="")!=0] 可能会更快。
  • @Tomas,我的 猜测 是某些数据被错误地读取,导致空字符列,NA 与读取错误不同,但这是个好建议无论如何。
  • 嗨阿南达...实际上,读入是正确的。外部数据以许多块的形式附加在一起。我必须解析出各个块并丢弃不相关的列。
  • @AnandaMahto 也许mydf[,colSums(mydf!="")&gt;0] 更合你的口味?
【解决方案2】:

您可以执行以下任一操作:

emptycols <- sapply(df, function (k) all(is.na(k)))
df <- df[!emptycols]

或:

emptycols <- colSums(is.na(df)) == nrow(df)
df <- df[!emptycols]

如果你用空表示它们是"",则可以像这样调整第二种方法:

emptycols <- colSums(df == "") == nrow(df)

【讨论】:

  • 这会引发错误。我认为 is.na() 仅适用于数字变量。
  • user702432,抛出的错误不是因为你在说什么,is.na 在字符向量上也可以正常工作。这是因为他正在将一个匿名函数传递给另一个函数。 @asb,我认为您不能那样做。你必须这样做sapply(df, function(x) all(is.na(x)))
  • 监督。刚刚修好了。
【解决方案3】:

如果您谈论的是所有值都是 NA 的列,请使用 janitor 包中的 remove_empty("cols")

如果您有每个值都是空字符串 "" 的字符向量,您可以首先使用 dplyr 包中的 na_if 在整个 data.frame 中将这些值转换为 NA

dat <- data.frame(
  x = c("a", "b", "c"),
  y = c("", "", ""),
  z = c(NA, NA, NA),
  stringsAsFactors = FALSE
)

dat
#>   x y  z
#> 1 a   NA
#> 2 b   NA
#> 3 c   NA

library(dplyr)
library(janitor)

dat %>%
  mutate_all(funs(na_if(., ""))) %>%
  remove_empty("cols")
#>   x
#> 1 a
#> 2 b
#> 3 c

【讨论】:

  • 完美解决方案!但是贬值了。包装上说:此功能已弃用,请改用remove_empty("cols")
  • @radek 很好,谢谢。我相应地更新了答案。
【解决方案4】:

我也有类似的情况——我正在使用一个大型公共记录数据库,但是当我将它缩减到我需要的日期范围和类别时,有大量的列没有被使用。有些是空白的,有些是 NA。

选择的答案:https://stackoverflow.com/a/17672737/233467 对我不起作用,但这样做:

df[!sapply(df, function (x) all(is.na(x) | x == ""))]

【讨论】:

    【解决方案5】:

    这取决于您所说的空是什么意思:是 NA 还是 "",或者甚至可以是 " "?这样的事情可能会起作用:

    df[,!apply(df, 2, function(x) all(gsub(" ", "", x)=="", na.rm=TRUE))]
    

    【讨论】:

      【解决方案6】:

      这也可以由dplyrselect_if 完成

      `select_if(df,function(x){any(!is.na(x))})`
      

      或使用is.null()x=="",具体取决于数据中空值的定义方式。

      【讨论】:

        【解决方案7】:

        可以修改以下内容以排除包含任何指定变量的列。

        newdf= df[, apply(df, 2, function(x) !any({is.na(x) | x== "" | 
        x== "-4"} ) )] 
        

        【讨论】:

          【解决方案8】:

          使用purrr 包的简单解决方案:

          purrr::discard(my_data_frame, ~all(is.na(.)))

          【讨论】:

            【解决方案9】:

            如果你知道列索引,你可以使用

            df[,-c(3, 5, 7)]
            

            这将省略第 3、5、7 列。

            【讨论】:

            • 不幸的是我没有。有400+个变量,空列都是随机放置的。
            猜你喜欢
            • 2019-09-06
            • 2021-05-23
            • 1970-01-01
            • 1970-01-01
            • 2021-08-23
            • 2016-09-09
            • 1970-01-01
            • 2014-08-09
            • 2013-11-26
            相关资源
            最近更新 更多