【问题标题】:How to find all numeric columns in data如何查找数据中的所有数字列
【发布时间】:2014-12-15 00:35:59
【问题描述】:

我正在尝试查找其中仅包含 numeric 数据的所有列名称。为此,我正在使用 is.numeric 并将其应用于我的数据,如下所示:

> sapply(ds[vars], is.numeric)
      MinTemp       MaxTemp      Rainfall   Evaporation      Sunshine   WindGustDir WindGustSpeed    WindDir9am    WindDir3pm  WindSpeed9am 
         TRUE          TRUE          TRUE          TRUE          TRUE         FALSE          TRUE         FALSE         FALSE          TRUE 
 WindSpeed3pm   Humidity9am   Humidity3pm   Pressure9am   Pressure3pm      Cloud9am      Cloud3pm       Temp9am       Temp3pm     RainToday 
         TRUE          TRUE          TRUE          TRUE          TRUE          TRUE          TRUE          TRUE          TRUE         FALSE 
 RainTomorrow 
        FALSE 

根据我的数据,以上是有道理的。例如,WindGustDirWindDir9am 列具有 NW 之类的值,这就是它们是 FALSE 的原因。

当我将它应用于我的数据以获取所有数字列的名称时,我不希望看到非数字列 - 例如 WindGustDirWindDir9am。但是,我看到的是 WindDir9am 而不是 WindGustDir问题我不明白为什么会这样。我该如何解决它,所以我只能得到数字列?

> numerics <- names(ds)[which(sapply(ds[vars], is.numeric))]
> numerics
 [1] "Date"         "Location"     "MinTemp"      "MaxTemp"      "Rainfall"     "Sunshine"     "WindDir9am"   "WindDir3pm"   "WindSpeed9am"
[10] "WindSpeed3pm" "Humidity9am"  "Humidity3pm"  "Pressure9am"  "Pressure3pm"  "Cloud9am"     "Cloud3pm"  

这是我正在使用的数据的链接:http://rattle.togaware.com/weather.csv

编辑

> vars
 [1] "MinTemp"       "MaxTemp"       "Rainfall"      "Evaporation"   "Sunshine"     
 [6] "WindGustDir"   "WindGustSpeed" "WindDir9am"    "WindDir3pm"    "WindSpeed9am" 
[11] "WindSpeed3pm"  "Humidity9am"   "Humidity3pm"   "Pressure9am"   "Pressure3pm"  
[16] "Cloud9am"      "Cloud3pm"      "Temp9am"       "Temp3pm"       "RainToday"    
[21] "RainTomorrow"

【问题讨论】:

  • 无论[vars] 是什么,删除它,一切都会按预期工作。
  • which 其实没必要
  • @flodel >_vars 是什么
  • @RichardScriven,但使用which 稍微快一些。 SO上有一个关于它的问题。

标签: r


【解决方案1】:

当你这样做时:

which(sapply(ds[vars], is.numeric))

你得到ds[vars](不是ds)的数字列的索引。因此,如果您想返回名称,重要的是您将其应用于 names(ds[vars]) 而不是 names(ds),后者具有不同的列。

names(ds[vars])[which(sapply(ds[vars], is.numeric))]

你也可以这样做:

vars[which(sapply(ds[vars], is.numeric))]

甚至像 Richard 建议的那样使用逻辑索引:

vars[sapply(ds[vars], is.numeric)]

最后,我会考虑var是否有用,看看是否直接在df上做工作:

names(df)[sapply(ds, is.numeric)]

得到你想要的。

【讨论】:

    【解决方案2】:

    which(sapply(ds[vars], is.numeric)) 应该提供一个索引向量,指示包含数字数据的列。假设 ds 是一个 data.frame 或矩阵对象,那么您可以使用这个向量来对您的原始数据进行子集化:

    ids <- which(sapply(ds, is.numeric))
    foo <- ds[, ids]
    

    编辑:再想一想,根本不需要which()。只是您的sapply() 的结果的子集:

    names(ds[, sapply(ds, is.numeric)])
    #[1] "MinTemp"       "MaxTemp"       "Rainfall"      "Evaporation"   "Sunshine"     
    #[6] "WindGustSpeed" "WindSpeed9am"  "WindSpeed3pm"  "Humidity9am"   "Humidity3pm"  
    #[11] "Pressure9am"   "Pressure3pm"   "Cloud9am"      "Cloud3pm"      "Temp9am"      
    #[16] "Temp3pm"       "RISK_MM" 
    

    【讨论】:

    • 对于最后一个建议,您正在构建一个完整的 data.frame 只是为了获取其列的名称。只需执行names(ds)[sapply(ds, is.numeric)],您就可以更好地利用资源。
    • @flodel 点,但是对names() 的调用只是为了证明子集按预期工作。我假设数据本身就是理想的输出。
    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 2018-03-18
    • 2011-02-13
    • 2023-01-13
    • 2016-05-31
    • 2020-07-24
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多