【问题标题】:Apply a function to every column对每一列应用一个函数
【发布时间】:2021-10-25 16:15:16
【问题描述】:

我是 R 新手,我想用我的数据集的 168 列中的每个值除以相应列的 SD。

我试过了:

new<- for (i in 1:168 (df))

function(x){
  x/sd(x, na.rm=TRUE)
}
}

但它没有用。这是我第一次使用循环或函数。因此,我很乐意为您提供帮助。 这是我的数据集(3 列)中的一个示例。共有 168 列,第 169 列有 ID。

structure(list(var1 = c(1, 2, 35, 5, 22, 26.5, 31, 35.5, 40, 
44.5, 49, 53.5, 58, 62.5, 67, 71.5, 76, 80.5, 85), var2 = c(1, 
2, 4, 5.33333333333333, 6.83333333333333, 8.33333333333333, 9.83333333333333, 
11.3333333333333, 12.8333333333333, 14.3333333333333, 15.8333333333333, 
17.3333333333333, 18.8333333333333, 20.3333333333333, 21.8333333333333, 
23.3333333333333, 24.8333333333333, 26.3333333333333, 27.8333333333333
), var3 = c(2, 1, 3, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 
8, 8.5, 9, 9.5, 10, 10.5)), row.names = c(NA, -19L), class = c("tbl_df", 
"tbl", "data.frame"))

谢谢, 卡罗

【问题讨论】:

标签: r


【解决方案1】:

在dplyr 中,您可以使用across 将一个函数应用于多个列。

library(dplyr)
df <- df %>% mutate(across(starts_with('var'), ~./sd(.)))
df

#    var1  var2  var3
#    <dbl> <dbl> <dbl>
# 1 0.0384 0.118 0.707
# 2 0.0767 0.237 0.354
# 3 1.34   0.474 1.06 
# 4 0.192  0.632 1.06 
# 5 0.844  0.809 1.24 
# 6 1.02   0.987 1.41 

在base R中,我们可以使用lapply -

df[] <- lapply(df, function(x) x/sd(x))

要将其应用于选定的列 (1:168),您可以这样做

df[1:168] <- lapply(df[1:168], function(x) x/sd(x))

【讨论】:

  • 加上这个,如果你真的想把函数应用到每一列,你可以使用across(everything())
【解决方案2】:

我们可以使用来自purrr 包的map_dfr:

libraray(purrr)
map_dfr(df, ~./sd(.))

输出:

     var1  var2  var3
    <dbl> <dbl> <dbl>
 1 0.0384 0.118 0.707
 2 0.0767 0.237 0.354
 3 1.34   0.474 1.06 
 4 0.192  0.632 1.06 
 5 0.844  0.809 1.24 
 6 1.02   0.987 1.41 
 7 1.19   1.16  1.59 
 8 1.36   1.34  1.77 
 9 1.53   1.52  1.94 
10 1.71   1.70  2.12 
11 1.88   1.88  2.30 
12 2.05   2.05  2.47 
13 2.22   2.23  2.65 
14 2.40   2.41  2.83 
15 2.57   2.59  3.01 
16 2.74   2.76  3.18 
17 2.92   2.94  3.36 
18 3.09   3.12  3.54 
19 3.26   3.30  3.71 

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2018-10-29
    • 1970-01-01
    • 2023-01-19
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多