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