如何计算R中许多列的NTile?

如何计算R中许多列的NTile?,r,dataframe,dplyr,mutate,R,Dataframe,Dplyr,Mutate,我有一个如下所示的数据帧: ID age sex chem1 chem2 chem3 ... chem524 01 64 m .06 6.8 .3 .2 02 57 f .7 24.3 NA .7 03 53 f .4 2.9 .03 1.6 04 68 m .7 37.8 .01 .01 05 73 m 1.2 1.4 2.8 3.6 06 49

我有一个如下所示的数据帧:

ID age sex chem1 chem2 chem3 ... chem524
01 64  m   .06   6.8    .3        .2
02 57  f   .7    24.3    NA       .7
03 53  f   .4    2.9    .03       1.6
04 68  m   .7    37.8   .01       .01
05 73  m   1.2   1.4    2.8       3.6
06 49  f   .3    7.6    .3        2.9
我需要为每种化学物质做3个字节。我知道如何一次处理一种化学物质,但我不想写524次

我希望每种化学物质的ntiles都存储在一个新的数据框中,以便我以后可以对它们进行进一步的分析

以下是我希望输出数据帧的外观:

ID age sex chem1 chem2 chem3 ... chem524
01 64  m    1     2     2         1
02 57  f    2     3     NA        2
03 53  f    2     1     1         3
04 68  m    2     3     1         1
05 73  m    3     1     3         3
06 49  f    1     2     2         3
以下是我尝试过的:

df2 <- mutate_at(df, vars(chem1:chem524), ntile(top_air[4:528], 3))

df2这里有一种方法是在
处使用
mutate\u:

library(dplyr)
df %>%
  mutate_at(vars(starts_with("chem")), .funs = list(~ntile(.,3)))
  ID age sex chem1 chem2 chem3 chem524
1  1  64   m     1     2     2       1
2  2  57   f     2     3    NA       2
3  3  53   f     2     1     1       2
4  4  68   m     3     3     1       1
5  5  73   m     3     1     3       3
6  6  49   f     1     2     2       3
df %>%
  mutate_at(vars(starts_with("chem")), ntile, 3)
  ID age sex chem1 chem2 chem3 chem524
1  1  64   m     1     2     2       1
2  2  57   f     2     3    NA       2
3  3  53   f     2     1     1       2
4  4  68   m     3     3     1       1
5  5  73   m     3     1     3       3
6  6  49   f     1     2     2       3
.funs=
参数的正确参数化有点特殊,但对于单个函数,只需提供一个以
~
开头的元素列表
~
是一个匿名函数的缩写,它有一个参数,我们可以使用
访问该参数

您还可以命名列表以获取新列:

df %>%
  mutate_at(vars(starts_with("chem")), list(ntile = ~ntile(.,3)))
另一种方法是一起跳过匿名函数,并使用
处的
mutate\u的
部分将附加参数传递给
ntile

library(dplyr)
df %>%
  mutate_at(vars(starts_with("chem")), .funs = list(~ntile(.,3)))
  ID age sex chem1 chem2 chem3 chem524
1  1  64   m     1     2     2       1
2  2  57   f     2     3    NA       2
3  3  53   f     2     1     1       2
4  4  68   m     3     3     1       1
5  5  73   m     3     1     3       3
6  6  49   f     1     2     2       3
df %>%
  mutate_at(vars(starts_with("chem")), ntile, 3)
  ID age sex chem1 chem2 chem3 chem524
1  1  64   m     1     2     2       1
2  2  57   f     2     3    NA       2
3  3  53   f     2     1     1       2
4  4  68   m     3     3     1       1
5  5  73   m     3     1     3       3
6  6  49   f     1     2     2       3

这里有一种使用
mutate_at
的方法:

library(dplyr)
df %>%
  mutate_at(vars(starts_with("chem")), .funs = list(~ntile(.,3)))
  ID age sex chem1 chem2 chem3 chem524
1  1  64   m     1     2     2       1
2  2  57   f     2     3    NA       2
3  3  53   f     2     1     1       2
4  4  68   m     3     3     1       1
5  5  73   m     3     1     3       3
6  6  49   f     1     2     2       3
df %>%
  mutate_at(vars(starts_with("chem")), ntile, 3)
  ID age sex chem1 chem2 chem3 chem524
1  1  64   m     1     2     2       1
2  2  57   f     2     3    NA       2
3  3  53   f     2     1     1       2
4  4  68   m     3     3     1       1
5  5  73   m     3     1     3       3
6  6  49   f     1     2     2       3
.funs=
参数的正确参数化有点特殊,但对于单个函数,只需提供一个以
~
开头的元素列表
~
是一个匿名函数的缩写,它有一个参数,我们可以使用
访问该参数

您还可以命名列表以获取新列:

df %>%
  mutate_at(vars(starts_with("chem")), list(ntile = ~ntile(.,3)))
另一种方法是一起跳过匿名函数,并使用
处的
mutate\u的
部分将附加参数传递给
ntile

library(dplyr)
df %>%
  mutate_at(vars(starts_with("chem")), .funs = list(~ntile(.,3)))
  ID age sex chem1 chem2 chem3 chem524
1  1  64   m     1     2     2       1
2  2  57   f     2     3    NA       2
3  3  53   f     2     1     1       2
4  4  68   m     3     3     1       1
5  5  73   m     3     1     3       3
6  6  49   f     1     2     2       3
df %>%
  mutate_at(vars(starts_with("chem")), ntile, 3)
  ID age sex chem1 chem2 chem3 chem524
1  1  64   m     1     2     2       1
2  2  57   f     2     3    NA       2
3  3  53   f     2     1     1       2
4  4  68   m     3     3     1       1
5  5  73   m     3     1     3       3
6  6  49   f     1     2     2       3

下面是一个
数据表
解决方案:

库(data.table)
df 2:57 f 0.70 3 NA 2
#>3:53 f 0.40 1 2
#>4:68M0.70311
#>5:73米1.20 1 3
#>6:49 f 0.3023

由(v0.3.0)于2020年5月23日创建。以下是
数据。表
解决方案:

库(data.table)
df 2:57 f 0.70 3 NA 2
#>3:53 f 0.40 1 2
#>4:68M0.70311
#>5:73米1.20 1 3
#>6:49 f 0.3023
由(v0.3.0)于2020年5月23日创建