【问题标题】:Is there data.table equivalent of 'select_if' and 'rename_if'?是否有相当于“select_if”和“rename_if”的data.table?
【发布时间】:2017-11-07 05:46:46
【问题描述】:

假设我有一个这样的数据框。

df <- data.frame(w = runif(2), x = c(T, F), y = letters[1:2], z = c(1L, 2L))

使用 dplyr,我可以轻松地根据列的类别或任何其他返回逻辑的函数重命名/选择。例如,我可以这样做

df %>% select_if(is.logical)
%       x
% 1  TRUE
% 2 FALSE

df %>% rename_if(is.double, paste, 'hat', sep = '_')
%       w_hat     x y z
% 1 0.8619479  TRUE a 1
% 2 0.8750867 FALSE b 2

选择“x”列,或将“w”重命名为“w_hat”。

是否有任何与这些基于函数的列选择等效的 data.table?

【问题讨论】:

    标签: r dataframe dplyr data.table


    【解决方案1】:

    使用data.table,将“data.frame”转换为“data.table”(setDT(df)),遍历列,应用is.doubleunlist 并获取列名。然后,用setnames 更改列名

    nm1 <- names(which(setDT(df)[, unlist(lapply(.SD, is.double))]))
    setnames(df, nm1, paste0(nm1, "_hat"))
    df
    #       w_hat     x y z
    #1: 0.2925740  TRUE a 1
    #2: 0.2248911 FALSE b 2
    

    可以使用data.table中的dplyr便捷功能

    setDT(df)[, select_if(.SD, is.logical)]
    #      x
    #1:  TRUE
    #2: FALSE
    
    
    setDT(df)[, rename_if(.SD, is.double, paste, 'hat', sep="_")]
    #       w_hat     x y z
    #1: 0.2925740  TRUE a 1
    #2: 0.2248911 FALSE b 2
    

    注意:rename_if 不会更改原始数据集中的列名,而 setnames 会更改它。

    【讨论】:

    • 谢谢!很高兴知道我可以在 [. 中使用 dplyr 函数
    • 类似地在 data.table 中使用 mutate_if 对于转换特定类型的所有列非常有用。它可以防止编写像 (names(which(setDT(df)[, unlist(lapply(.SD, is.double))]))) 这样的复杂代码。谢谢
    猜你喜欢
    • 2020-08-25
    • 2016-11-06
    • 2017-09-14
    • 2017-01-08
    • 2010-10-16
    • 2023-04-04
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多