Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 引用调用mutate()中的上一列/下一列_R_Tidyverse - Fatal编程技术网

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])