【问题标题】:remove character columns from a numeric data frame从数字数据框中删除字符列
【发布时间】:2013-07-25 15:59:05
【问题描述】:

我有一个像你在这里看到的那样的数据框。

     DRSi       TP        DOC        DN          date     Turbidity   Anions 
     158        5.9       3371       264        14/8/06      5.83    2246.02
     217        4.7       2060       428        16/8/06      6.04    1632.29
     181        10.6      1828       219        16/8/06      6.11    1005.00
     397        5.3       1027       439        16/8/06      5.74    314.19
     2204       81.2      11770      1827       15/8/06      9.64    2635.39
     307        2.9       1954       589        15/8/06      6.12    2762.02
     136        7.1       2712       157        14/8/06      5.83    2049.86
     1502       15.3      4123       959        15/8/06      6.48    2648.12
     1113       1.5       819        195        17/8/06      5.83    804.42
     329        4.1       2264       434        16/8/06      6.19    2214.89
     193        3.5       5691       251        17/8/06      5.64    1299.25
     1152       3.5       2865       1075       15/8/06      5.66    2573.78
     357        4.1       5664       509        16/8/06      6.06    1982.08
     513        7.1       2485       586        15/8/06      6.24    2608.35
     1645       6.5       4878       208        17/8/06      5.96    969.32

在我到达这里之前,我使用以下代码删除了那些根本没有值或一些 NA 的列。

    rem = NULL
    for(col.nr in 1:dim(E.3)[2]){
      if(sum(is.na(E.3[, col.nr]) > 0 | all(is.na(E.3[,col.nr])))){
        rem = c(rem, col.nr)
      }
    }
    E.4 <- E.3[, -rem]  

现在我需要删除“日期”列,但不是基于它的列名,而是基于它是一个字符串这一事实。

我在这里 (Remove an entire column from a data.frame in R) 已经看到如何简单地将其设置为 NULL 和其他选项,但我想使用不同的参数。

【问题讨论】:

  • 请考虑修改问题的正文。目前还不是很清楚。
  • 我会去mydf &lt;- mydf[sapply(mydf, is.numeric)]
  • 谢谢@dickoa,使用 is.numeric 作为参数重写我的 df 以仅选择那些数字列非常有用。

标签: r


【解决方案1】:

首先使用is.character 查找类character 的所有列。但是,请确保您的日期确实是 character,而不是 Datefactor。否则使用is.Dateis.factor 而不是is.character

然后只需对 data.frame 中不是字符的列进行子集化,例如

df[, !sapply(df, is.character)]

【讨论】:

  • 或者,一种破坏性的方法:df[sapply(df, is.character)] &lt;- list(NULL).
  • @shadow 感谢您提供有关首先检查它是字符、因子还是日期的提示。这实际上是一个因素,所以我用 is.factor 切换了 is.character 并且工作得很好。 Ananda Matho 您的示例也同样有效,谢谢!
  • @umbra,如果可以解决您的问题,请考虑将 shadow 的答案标记为 已接受。谢谢。
  • 在哪里可以找到这个有趣的 'is.Date' 函数?
  • @WD_R: 显然它不存在...(或者至少我再也找不到它了。)您可以定义is.Date &lt;- function(d) "Date" %in% class(d),但只能找到Date 类的日期和不会,例如找到POSIXct 日期。
【解决方案2】:

我遇到了类似的问题,但上面的答案不能解决 Date 列(这就是我需要的),所以我找到了另一个解决方案:

df[,-grep ("Date|factor|character", sapply (df, class))]

将返回您的 df,不带日期、字符和因子列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多