【问题标题】:dplyr mutating multiple columns by prefix and suffixdplyr 通过前缀和后缀改变多列
【发布时间】:2018-04-06 13:50:05
【问题描述】:

我有一个问题,我可以使用 iris 数据集进行复制,其中许多组(名称中的前缀相同)具有两个不同后缀的变量。我想对所有这些组进行一个比例,但找不到一个 tidyverse 解决方案。我本来可以通过 mutate_at() 可能已经能够提供帮助。

在鸢尾花数据集中,您可以考虑为花瓣列我想生成长度/宽度的花瓣比例。同样,我想为 Sepal 执行此操作。我不想在mutate() 中手动执行此操作,因为我有很多变量组,而且这可能会随着时间而改变。

我确实有一个使用 base R 的解决方案(在下面的代码中),但我想知道是否有一个 tidyverse 解决方案可以实现相同的效果。

# libs ----
library(tidyverse)

# data ----
df <- iris
glimpse(df)

# set up column vectors ----
length_cols <- names(df) %>% str_subset("Length") %>% sort()
width_cols <- names(df) %>% str_subset("Width") %>% sort()
new_col_names <- names(df) %>% str_subset("Length") %>% str_replace(".Length", ".Ratio") %>% sort()

length_cols
width_cols
new_col_names

# make new cols ----
df[, new_col_names] <- df[, length_cols] / df[, width_cols]
df %>% head()

谢谢, 加雷斯

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    这是使用purrr::map的一种可能性:

    library(tidyverse);
    df <- map(c("Petal", "Sepal"), ~ iris %>%
        mutate(
            !!paste0(.x, ".Ratio") := !!as.name(paste0(.x, ".Length")) / !!as.name(paste0(.x, ".Width")) )) %>%
        reduce(left_join);
    head(df);
    #  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Petal.Ratio
    #1          5.1         3.5          1.4         0.2  setosa        7.00
    #2          4.9         3.0          1.4         0.2  setosa        7.00
    #3          4.7         3.2          1.3         0.2  setosa        6.50
    #4          4.6         3.1          1.5         0.2  setosa        7.50
    #5          5.0         3.6          1.4         0.2  setosa        7.00
    #6          5.4         3.9          1.7         0.4  setosa        4.25
    #  Sepal.Ratio
    #1    1.457143
    #2    1.633333
    #3    1.468750
    #4    1.483871
    #5    1.388889
    #6    1.384615
    

    解释:我们map前缀"Petal""Sepal"iris通过为每个前缀提取带有后缀"Length""Width"的列,并计算一个新的对应前缀+".Ratio"列; reduce 合并了 data.frames。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      相关资源
      最近更新 更多