R 引用调用mutate()中的上一列/下一列
我的数据如下所示:R 引用调用mutate()中的上一列/下一列,r,tidyverse,R,Tidyverse,我的数据如下所示: set.seed(1234) library(tidyverse) df <- data.frame(Time = c(1,1,2,2,3,3), Region = c("A", "B", "A", "B", "A", "B"), Age_1 = round(rnorm(6, mea
set.seed(1234)
library(tidyverse)
df <- data.frame(Time = c(1,1,2,2,3,3),
Region = c("A", "B", "A", "B", "A", "B"),
Age_1 = round(rnorm(6, mean = 10),0),
Age_2 = round(rnorm(6, mean = 10),0),
Age_3 = round(rnorm(6, mean = 10),0),
Age_4 = round(rnorm(6, mean = 10),0),
Age_5 = round(rnorm(6, mean = 10),0))
df %>%
group_by(Region) %>%
mutate(across(4:7, ~ . / dplyr::lag(.[?], order_by = Time), .names="Ratio_{.col}"))
因为我的原始数据有很多年龄组,所以这个过程需要很多人工编码。在我看来,编程解决方案可能是这样的:
set.seed(1234)
library(tidyverse)
df <- data.frame(Time = c(1,1,2,2,3,3),
Region = c("A", "B", "A", "B", "A", "B"),
Age_1 = round(rnorm(6, mean = 10),0),
Age_2 = round(rnorm(6, mean = 10),0),
Age_3 = round(rnorm(6, mean = 10),0),
Age_4 = round(rnorm(6, mean = 10),0),
Age_5 = round(rnorm(6, mean = 10),0))
df %>%
group_by(Region) %>%
mutate(across(4:7, ~ . / dplyr::lag(.[?], order_by = Time), .names="Ratio_{.col}"))
包含dplyr::lag(.[?])
的部分需要引用数据框中与
相关的前一列,但我还没有找到这样做的方法
注意:这个问题与昨天的一篇文章有关,在这篇文章中,我试图用长格式的数据解决手头的问题。但是,以广泛的格式进行操作是一个不同的问题,这就是我打开此问题的原因。这里有一个跨
的选项
library(dplyr)
library(stringr)
df %>%
group_by(Region) %>%
mutate(across(matches('^Age_[2-5]$'),
~ ./lag(get(str_replace(cur_column(), '\\d+',
as.character(readr::parse_number(cur_column())-1))), order_by = Time ),
.names = "Ratio_{.col}" )) %>%
ungroup
或者可以用一种简化的方式来完成
library(purrr)
df[str_c('Region_', 2:5)] <- map2(df[4:7], df[3:6],
~ .x/lag(.y, order_by = df$Time))
库(purrr)
df[str_c('Region_',2:5)]谢谢你。这真是太棒了!太棒了,谢谢@akrun。我想最简单的解决方案应该是“purrr”,但这段代码我想不出来myself@tifu你不需要一个包裹。i、 e.它也可以在base R
中完成,即df[paste0('Region_',2:5])