gpt4 book ai didi

r - 如何使用 purrr :map function? 使用动态变量改变多列

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

我有一个数据框如下:

df <- data.frame(
id = c(1:5),
a = c(3,10,4,0,15),
b = c(2,1,1,0,3),
c = c(12,3,0,3,1),
d = c(9,7,8,0,0),
e = c(1,2,0,2,2)
)

我需要添加多个列,其名称由 a:c3:5 的组合给出。 3:5 也用于 sum 函数:

df %>% mutate(
usa_3 = sum(1+3),
usa_4 = sum(1+4),
usa_5 = sum(1+5),
canada_3 = sum(1+3),
canada_4 = sum(1+4),
canada_5 = sum(1+5),
nz_3 = sum(1+3),
nz_4 = sum(1+4),
nz_5 = sum(1+5)
)

结果非常简单,但我不想重复放置类似的代码。

  id  a b  c d e usa_3 usa_4 usa_5 canada_3 canada_4 canada_5 nz_3 nz_4 nz_5
1 1 3 2 12 9 1 4 5 6 4 5 6 4 5 6
2 2 10 1 3 7 2 4 5 6 4 5 6 4 5 6
3 3 4 1 0 8 0 4 5 6 4 5 6 4 5 6
4 4 0 0 3 0 2 4 5 6 4 5 6 4 5 6
5 5 15 3 1 0 2 4 5 6 4 5 6 4 5 6

变量是字母前缀和整数范围作为后缀。Postfix 也与 sum 函数相关,如 1+postfix。在本例中,它们每个都有 3 个值,因此结果有 9 个附加列。

我不喜欢在一堆代码之外定义函数,并且假设 purrr 中的 map functino 可能会有所帮助。

你知道如何让它发挥作用吗?尤其是在管道中给出动态列名是很困难的。

我发现了一些类似的问题,但不符合我的需求。

Multivariate mutate
How to use map from purrr with dplyr::mutate to create multiple new columns based on column pairs

====附加信息=====
让我澄清一下这个问题的一些条件。实际上 sum(1+3), sum(1+4)... 部分被替换为 as.factor(cuttree(X,k=X) ),其中 X 是聚类分析的结果,Y 是示例中定义为 3:5 的变量。 cuttree() 是一个函数,用于定义我们在聚类分析结果中存储的树状图的哪一部分进行切割。

对于列名usa_3, usa_4 ... nz_5,国家名称被替换为聚类分析方法,如ward、McQuitty、Median方法等(七种方法)和整数3、4、5 是定义我需要在哪一部分切割树状图的参数,如所解释的。

对于函数as.factor(cuttree(X,k=X))中的一个X,聚类分析的结果也有对应的几个数据框到每个方法。我意识到另一个问题是如何将函数应用于每个数据框(聚类分析的结果存储在不同的数据框中)。
我当前使用的实际脚本是这样的:

cluste_number <- original_df %>% mutate(
## Ward
ward_3=as.factor(cutree(clst.ward,k=3)),
ward_4=as.factor(cutree(clst.ward,k=4)),
ward_5=as.factor(cutree(clst.ward,k=5)),
ward_6=as.factor(cutree(clst.ward,k=6)),
## Single
sing_3=as.factor(cutree(clst.sing,k=3)),
sing_4=as.factor(cutree(clst.sing,k=4)),
sing_5=as.factor(cutree(clst.sing,k=5)),
sing_6=as.factor(cutree(clst.sing,k=6)))

很抱歉没有澄清实际问题;然而,由于上述原因,美国、加拿大、新西兰等国家/地区数量与1:3参数数量不匹配。另外,一些使用 i + . 的建议并不能解决问题,因为在实际操作中使用了函数 as.factor(cuttree(X,k=X))

感谢您的支持。

最佳答案

不确定您在做什么,但这也许有助于澄清问题..

library(tidyverse)

df <- data.frame(
id = c(1:5),
a = c(3,10,4,0,15),
b = c(2,1,1,0,3),
c = c(12,3,0,3,1),
d = c(9,7,8,0,0),
e = c(1,2,0,2,2)
)

ctry <- rep(c("usa", "ca", "nz"), each = 3)
nr <- rep(seq(3,5), times = 3)
df %>%
as_tibble() %>%
bind_cols(map_dfc(seq_along(ctry), ~1+nr[.x] %>%
rep(nrow(df))) %>%
set_names(str_c(ctry, nr, sep = "_")))

# A tibble: 5 x 15
id a b c d e usa_3 usa_4 usa_5 ca_3 ca_4 ca_5 nz_3 nz_4 nz_5
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 3 2 12 9 1 4 5 6 4 5 6 4 5 6
2 2 10 1 3 7 2 4 5 6 4 5 6 4 5 6
3 3 4 1 0 8 0 4 5 6 4 5 6 4 5 6
4 4 0 0 3 0 2 4 5 6 4 5 6 4 5 6
5 5 15 3 1 0 2 4 5 6 4 5 6 4 5 6

关于r - 如何使用 purrr :map function? 使用动态变量改变多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57183024/

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