将mutate_at用于满足两个条件的变量dplyr R

J.S*_*ree 4 select r dplyr recode mutate

我正在尝试对数据框中的某些项目进行评分(重新编码)。所有反向得分的项目都以R结尾,并且每个音阶都有一个唯一的开始(“ hc”,“ out”和“ hm”)。我通常只选择所有以“ r”结尾的变量,但是问题是有些标度为5点标度(“ hc”和“ out”),而其他标度为7点标度(“ hm” ”)。

这是更大得多的数据集的示例:

library(tidyverse)

data <- tibble(name = c("Mike", "Ray", "Hassan"),
               hc_1 = c(1, 2, 3),
               hc_2r = c(5, 5, 4),
               out_1r = c(5, 4, 2),
               out_2 = c(2, 4, 5),
               out_3r = c(2, 2, 1),
               hm_1 = c(6, 7, 7),
               hm_2r = c(7, 1, 7))
Run Code Online (Sandbox Code Playgroud)

假设我想一次做一个标度,所以我从hm开始,它是七点标度。

我想用&语句尝试类似的操作,但出现错误:

library(tidyverse)
library(car)
data %>%
  mutate_at(vars(ends_with("r") & starts_with("hm")), ~(recode(., "1=7; 2=6; 3=5; 4=4; 5=3; 6=2; 7=1")))

Run Code Online (Sandbox Code Playgroud)

错误:ends_with("r") & starts_with("hc")必须求值为列的位置或名称,而不是逻辑向量

有什么干净的方法可以让它一次对这几个变量执行反向计分?再一次,数据集太大,实际上一次只能选择单个变量。

谢谢!

akr*_*run 5

matches在这里使用会更容易

library(tidyverse)
data %>%
     mutate_at(vars(matches("^hm.*r$")), ~(recode(.,
              "1=7; 2=6; 3=5; 4=4; 5=3; 6=2; 7=1")))
Run Code Online (Sandbox Code Playgroud)