是否有用于对数据帧的每一列执行基本操作的 R 函数? [复制]
Posted
技术标签:
【中文标题】是否有用于对数据帧的每一列执行基本操作的 R 函数? [复制]【英文标题】:Is there an R function for performing basic operations on every column of a data frame? [duplicate] 【发布时间】: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 会在这里工作吗?
【问题讨论】:
【参考方案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')]
【讨论】:
以上是关于是否有用于对数据帧的每一列执行基本操作的 R 函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:应用pivot_longer函数将数据从宽格式转换为长格式为dataframe的每一列绘制密度图和直方图(堆叠)