2

我想一次转换大型 data.frame 中的多个列across

作为一个例子,我想做这个转换

library(tidyverse)

iris %>% mutate(Sepal.Length2 = (Sepal.Length^4-min(Sepal.Length^4)) / (max(Sepal.Length^4) - min(Sepal.Length^4)))

但对于所有以“Sepal”开头的列。

我想,我可以使用这个命令,但我不知道如何添加我的功能。

iris %>% mutate(across(starts_with("Sepal")), ... )

对不起,如果它太琐碎了,但我不知道我必须进入谷歌才能找到一些有用的页面。

4

2 回答 2

3

我们可以用

library(dplyr)
iris1 <- iris %>%
    mutate(across(starts_with("Sepal"),
           ~ (.^4-min(.^4)) / (max(.^4) - min(.^4)), .names = '{.col}2'))
于 2021-05-14T18:20:30.537 回答
3
my_function <- function(x) {
  y = x^4-min(x^4)/max(x^4)/min(x^4)
  return=y
}

iris %>%
  mutate(across(starts_with("Sepal"), my_function))

输出:

   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1       676.5198   150.05983          1.4         0.2     setosa
2       576.4798    80.99733          1.4         0.2     setosa
3       487.9678   104.85493          1.3         0.2     setosa
4       447.7453    92.34943          1.5         0.2     setosa
5       624.9997   167.95893          1.4         0.2     setosa
6       850.3053   231.34143          1.7         0.4     setosa
7       447.7453   133.63093          1.4         0.3     setosa
8       624.9997   133.63093          1.5         0.2     setosa
9       374.8093    70.72543          1.4         0.2     setosa
10      576.4798    92.34943          1.5         0.1     setosa
11      850.3053   187.41343          1.5         0.2     setosa
12      530.8413   133.63093          1.6         0.2     setosa
13      530.8413    80.99733          1.4         0.1     setosa
14      341.8798    80.99733          1.1         0.1     setosa
15     1131.6493   255.99733          1.2         0.2     setosa
.....
于 2021-05-14T18:23:29.550 回答