dplyr通过前缀和后缀改变多个列

时间:2018-04-06 13:50:06

标签: r dplyr tidyverse

我有一个问题,我可以使用虹膜数据集进行复制,其中许多组(名称中的前缀相同)具有两个不同的后缀。我希望对所有这些群体采取比例,但无法找到一个整齐的解决方案......我可以通过mutate_at()得到帮助。

在虹膜数据集中,您可以考虑使用Petal列我想要生成长度/宽度的花瓣比例。同样地,我想为Sepal做这件事。我不想在mutate()中手动执行此操作,因为我有很多变量组,这可能会随着时间的推移而发生变化。

我确实有一个使用基础R的解决方案(在下面的代码中),但我想知道是否有一个达到相同的整数解决方案。

# 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()

谢谢, 加雷

1 个答案:

答案 0 :(得分:0)

以下是使用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.frame s。