gpt4 book ai didi

r - 使用 mutate_at 创建新变量,同时保留原始变量

转载 作者:行者123 更新时间:2023-12-03 06:50:14 25 4
gpt4 key购买 nike

考虑这个简单的例子:

library(dplyr)
library(tibble)

dataframe <- tibble(helloo = c(1,2,3,4,5,6),
ooooHH = c(1,1,1,2,2,2),
ahaaa = c(200,400,120,300,100,100))

# A tibble: 6 x 3
helloo ooooHH ahaaa
<dbl> <dbl> <dbl>
1 1 1 200
2 2 1 400
3 3 1 120
4 4 2 300
5 5 2 100
6 6 2 100

这里我想将函数 ntile 应用于包含 oo 的所有列,但我希望这些新列被称为 cat > + 相应的列。

我知道我能做到

dataframe %>% mutate_at(vars(contains('oo')), .funs = funs(ntile(., 2)))
# A tibble: 6 x 3
helloo ooooHH ahaaa
<int> <int> <dbl>
1 1 1 200
2 1 1 400
3 1 1 120
4 2 2 300
5 2 2 100
6 2 2 100

但我需要的是这个

# A tibble: 8 x 5
helloo ooooHH ahaaa cat_helloo cat_ooooHH
<dbl> <dbl> <dbl> <int> <int>
1 1 1 200 1 1
2 2 1 400 1 1
3 3 1 120 1 1
4 4 2 300 2 2
5 5 2 100 2 2
6 5 2 100 2 2
7 6 2 100 2 2
8 6 2 100 2 2

是否有一种解决方案不需要存储中间数据并合并回原始数据帧?

最佳答案

dplyr 1.0.0 更新 2020-06

dplyr 1.0.0 开始,across() 函数取代了 mutate_at() 等函数的“作用域变体”。 across() 中的代码应该看起来非常熟悉,它嵌套在 mutate() 中。

向列表中给出的函数添加名称会将函数名称添加为后缀。

dataframe %>%
mutate( across(contains('oo'),
.fns = list(cat = ~ntile(., 2))) )

# A tibble: 6 x 5
helloo ooooHH ahaaa helloo_cat ooooHH_cat
<dbl> <dbl> <dbl> <int> <int>
1 1 1 200 1 1
2 2 1 400 1 1
3 3 1 120 1 1
4 4 2 300 2 2
5 5 2 100 2 2
6 6 2 100 2 2

在 1.0.0 中,使用 across() 中的 .names 参数更改新列名称要容易一些。下面是添加函数名称作为前缀而不是后缀的示例。这使用glue语法。

dataframe %>%
mutate( across(contains('oo'),
.fns = list(cat = ~ntile(., 2)),
.names = "{fn}_{col}" ) )

# A tibble: 6 x 5
helloo ooooHH ahaaa cat_helloo cat_ooooHH
<dbl> <dbl> <dbl> <int> <int>
1 1 1 200 1 1
2 2 1 400 1 1
3 3 1 120 1 1
4 4 2 300 2 2
5 5 2 100 2 2
6 6 2 100 2 2

mutate_at() 的原始答案

进行编辑以反射(reflect) dplyr 中的更改。从 dplyr 0.8.0 开始,funs() 已弃用,应使用带有 ~list()

您可以为传递给 .funs 的列表中的函数命名,以创建带有名称作为后缀的新变量。

dataframe %>% mutate_at(vars(contains('oo')), .funs = list(cat = ~ntile(., 2)))

# A tibble: 6 x 5
helloo ooooHH ahaaa helloo_cat ooooHH_cat
<dbl> <dbl> <dbl> <int> <int>
1 1 1 200 1 1
2 2 1 400 1 1
3 3 1 120 1 1
4 4 2 300 2 2
5 5 2 100 2 2
6 6 2 100 2 2

如果您希望将其作为前缀,则可以使用 rename_at 更改名称。

dataframe %>% 
mutate_at(vars(contains('oo')), .funs = list(cat = ~ntile(., 2))) %>%
rename_at( vars( contains( "_cat") ), list( ~paste("cat", gsub("_cat", "", .), sep = "_") ) )

# A tibble: 6 x 5
helloo ooooHH ahaaa cat_helloo cat_ooooHH
<dbl> <dbl> <dbl> <int> <int>
1 1 1 200 1 1
2 2 1 400 1 1
3 3 1 120 1 1
4 4 2 300 2 2
5 5 2 100 2 2
6 6 2 100 2 2

早期版本的 dplyr 中使用 funs() 的先前代码:

dataframe %>% 
mutate_at(vars(contains('oo')), .funs = funs(cat = ntile(., 2))) %>%
rename_at( vars( contains( "_cat") ), funs( paste("cat", gsub("_cat", "", .), sep = "_") ) )

关于r - 使用 mutate_at 创建新变量,同时保留原始变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45947787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com