【问题标题】:Is there an R function for performing basic operations on every column of a data frame? [duplicate]是否有用于对数据帧的每一列执行基本操作的 R 函数? [复制]
【发布时间】:2020-08-02 04:49:46
【问题描述】:

我有一个包含 n 列的数据框,如下所示,所有列都是数字(例如,下面只有 3 个,但实际的列有一个未知数)。

col_1 col_2 col_3 
1      3     7   
3      8     9   
5      5     2 
8      10    1
11     9     2 

我正在尝试根据以下等式转换每一列的数据:(x-min(col)/(max(col)-min(col)),以便每个元素都根据列中的值进行缩放。

有没有办法在不使用 for 循环遍历每一列的情况下做到这一点? sapply 或 tapply 会在这里工作吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以在数据集上使用scale

    scale(df1)
    

    或者如果我们想使用自定义函数,创建函数,使用lapply 遍历列,应用函数并将其分配回数据框

    f1 <- function(x) (x-min(col)/(max(col)-min(col))
    df1[] <- lapply(df1, f1)
    

    或者这可以通过mutate_all来完成

    library(dplyr) 
    df1 %>%
        mutate_all(f1)
    

    【讨论】:

    • 为了完整起见,您还可以提出data.table选项:df[,lapply(.SD, function(x) return((x-min(col)/(max(col)-min(col)))]
    • 好的,很好!
    【解决方案2】:

    作为@akrun 答案的补充,您也可以使用data.table 来做到这一点

    library(data.table)
    setDT(df)
    df[,lapply(.SD, function(x) return((x-min(col)/(max(col)-min(col)))]
    

    如果您想使用列的子集,可以使用 .SDcols 参数,例如

    library(data.table)
    df[,lapply(.SD, function(x) return((x-min(col)/(max(col)-min(col))),
    .SDcols = c('a','b')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多