在R中动态地对每一列执行特定的数学函数

ffscu2ro  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(155)

我想动态地对 Dataframe 中的每个唯一项执行数学函数。
通常要执行数学函数,我们使用mutate语句并创建一个列,然后通过在mutate语句之后编写mutate语句来手动执行数学函数。
这在几个列上是可行的。但是,如果我有100列,我必须执行2-5个数学函数,例如:一个是在初始数的基础上增加20%,另一个是在每列上将初始数除以2,并保持原始列不变。
在R中,除了为每个特定的项目编写mutate语句之外,这是可能的吗?
我使用的 Dataframe 是:

structure(list(`Row Labels` = c("2023-03-01", "2023-04-01", "2023-05-01", 
"2023-06-01", "2023-07-01", "2023-08-01", "2023-09-01", "2023-10-01"
), X6 = c(14, 16, 14, 11, 9, 9, 11, 11), X7 = c(50, 50, 50, 50, 
50, 50, 50, 50), X8 = c(75, 75, 75, 75, 75, 75, 75, 75), X9 = c(100, 
100, 100, 100, 100, 100, 100, 100), X11 = c(25, 25, 50, 75, 125, 
200, 325, 525), X12 = c(50, 50, 100, 150, 250, 400, 650, 1050
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-8L))

对于个别情况,此代码足以:

library(readxl)
library(dplyr)
Book1 <- read_excel("C:/X/X/X- X/X/Book1.xlsx",sheet = "Sheet6")

dput(Book1)

Book1 <- Book1 %>% 
  mutate(`X6 20%` = X6*1.20) %>% 
  mutate(`X6 by 2`= X6/2)

我想通过一个循环来运行它,但是选择多个列成为一个问题,因为我们必须在mutate语句中指定列名,我相信这在这里是不可能的。
谁能告诉我这是否可以用一种简单的方法实现?
预期输出如下:

nvbavucw

nvbavucw1#

我们可以使用across()
更新:更短:

library(dplyr)

df %>% 
  mutate(across(2:7, list("20" = ~. * 1.20, 
                          "By_2" = ~. / 2), .names = "{col}_{fn}"))

第一个答案:

library(dplyr)

df %>% 
  mutate(across(2:7, ~. * 1.20, .names = "{.col}_20%"),
         across(2:7, ~. /2, .names = "{.col}_By 2"))

  `Row Labels`    X6    X7    X8    X9   X11   X12 `X6_20%` `X7_20%` `X8_20%` `X9_20%` `X11_20%` `X12_20%` `X6_By 2` `X7_By 2` `X8_By 2` `X9_By 2` `X11_By 2` `X12_By 2`
  <chr>        <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>    <dbl>    <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>      <dbl>      <dbl>
1 2023-03-01      14    50    75   100    25    50     16.8       60       90      120        30        60       7          25      37.5        50       12.5         25
2 2023-04-01      16    50    75   100    25    50     19.2       60       90      120        30        60       8          25      37.5        50       12.5         25
3 2023-05-01      14    50    75   100    50   100     16.8       60       90      120        60       120       7          25      37.5        50       25           50
4 2023-06-01      11    50    75   100    75   150     13.2       60       90      120        90       180       5.5        25      37.5        50       37.5         75
5 2023-07-01       9    50    75   100   125   250     10.8       60       90      120       150       300       4.5        25      37.5        50       62.5        125
6 2023-08-01       9    50    75   100   200   400     10.8       60       90      120       240       480       4.5        25      37.5        50      100          200
7 2023-09-01      11    50    75   100   325   650     13.2       60       90      120       390       780       5.5        25      37.5        50      162.         325
8 2023-10-01      11    50    75   100   525  1050     13.2       60       90      120       630      1260       5.5        25      37.5        50      262.         525

相关问题