【问题标题】:best way to select columns from data.table by type [duplicate]按类型从data.table中选择列的最佳方法[重复]
【发布时间】:2020-04-19 10:26:41
【问题描述】:

我正在寻找一种优雅或高效的方式来选择Rdata.table 中的列。

我个人看重灵活的方法。

因此,我倾向于根据列的特征而不是名称来引用列。

例如,我想将所有列的值设置为小写。

如果我在这个操作中包含所有列,像这样

dt[, lapply(.SD, tolower),.SDcols = names(dt)]

数字和整数列也将转换为(小写)字符。

这是不可取的,因此我首先将所有字符列标识为以下内容:

char_cols <- as.character(names(dt[ , lapply(.SD, function(x) which(is.character(x)))]))

然后将char_cols 传递给 .SDcols

dt[ , lapply(.SD, tolower), .SDcols = char_cols ]

如果相反,您的所有列都是字符(例如,为了避免在读取数据时出现类型转换问题)我会这样做

char_cols <- as.character(names(dt[ , lapply(.SD, function(x) which(all(is.na(as.numeric(x)))))]))

但是应该确定的是,没有任何列是混合类型的:即包含一些字符串和一些数值。

有没有人建议更优雅或更有效地处理这个问题?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以将逻辑/字符向量传递给.SDcols

    对于字符列,我们可以这样做

    library(data.table)
    cols <- names(Filter(is.character, dt))
    dt[, (cols) := lapply(.SD, tolower), .SDcols = cols]
    

    【讨论】:

    • 那肯定更优雅。第二种情况呢。我将所有数据加载为字符类型以避免转换问题,例如日期。你能想出更好的方法来选择那些实际字符类型的列吗?
    • @o_v 您可以使用type.convert 获取各自类中的数据。 dt &lt;- type.convert(dt, as.is = TRUE)
    • 所以我认为SDcols = sapply(dt, is.character) 解决方案的缺点是我只剩下字符列。因此,如果我想同时保留字符列和数字列,我的解决方案仍然会更好。
    • 查看更新的答案。这将帮助您保留dt 中的所有列。
    • 整洁!我知道我这样做太麻烦了。
    【解决方案2】:

    我们可以使用

    library(data.table)
    cols <- names(which(sapply(dt, is.character)))
    dt[, (cols) := lapply(.SD, tolower), .SDcols = cols]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-16
      • 2014-09-27
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2010-09-26
      • 2015-03-21
      相关资源
      最近更新 更多