正如你可能已经猜到的那样,我很难描述这个问题.我想通过对现有列的子集求和来计算一个新变量including its name,这些列由这些变量名称的一个小元素定义,然后从新创建的变量计算一个新的条件变量.一如既往,通过示例更容易地展示.玩具数据.总共有七列,一列是ID变量,然后是三列大麻措施(由列名中央的字母"Cann"定义),然后是三列wine 精措施(由同一位置的字母"alc"定义).
set.seed(1)
d <- data.frame(id = letters[1:10],
q1_cann_a = round(rnorm(10),1),
q1_cann_b = round(rnorm(10),1),
q1_cann_c = round(rnorm(10),1),
q1_alc_a = round(rnorm(10),1),
q1_alc_b = round(rnorm(10),1),
q1_alc_c = round(rnorm(10),1))
d
# output
# id q1_cann_a q1_cann_b q1_cann_c q1_alc_a q1_alc_b q1_alc_c
# 1 a -0.6 1.5 0.9 1.4 -0.2 0.4
# 2 b 0.2 0.4 0.8 -0.1 -0.3 -0.6
# 3 c -0.8 -0.6 0.1 0.4 0.7 0.3
# 4 d 1.6 -2.2 -2.0 -0.1 0.6 -1.1
# 5 e 0.3 1.1 0.6 -1.4 -0.7 1.4
# 6 f -0.8 0.0 -0.1 -0.4 -0.7 2.0
# 7 g 0.5 0.0 -0.2 -0.4 0.4 -0.4
# 8 h 0.7 0.9 -1.5 -0.1 0.8 -1.0
# 9 i 0.6 0.8 -0.5 1.1 -0.1 0.6
# 10 j -0.3 0.6 0.4 0.8 0.9 -0.1
现在假设我要计算三个大麻列的总和,所以我创建了一个函数,在该函数中,我可以将每组三个变量名中间的字符串传递给一个函数,该函数根据该字符串创建一个新的变量名,并在末尾粘贴"_TOTAL".这部分我能做到.下一步是使用新创建的变量创建一个新的条件变量,在本例中,如果三个变量的和为>;0,则元素为"正",否则元素为"负".
sumFunct <- function(data, drug) {
d %>%
rowwise %>%
mutate(!!paste0(drug, "_total") := sum(c_across(contains(drug))),
!!paste0(drug, "_any") := factor(case_when(!!paste0(drug, "_total") > 0 ~ "positive",
TRUE ~ "negative"),
levels = c("negative",
"positive")))
}
sumFunct(d, "cann")
# A tibble: 10 × 9
# Rowwise:
# id q1_cann_a q1_cann_b q1_cann_c q1_alc_a q1_alc_b q1_alc_c cann_total cann_any
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
# 1 a -0.6 1.5 0.9 1.4 -0.2 0.4 1.8 positive
# 2 b 0.2 0.4 0.8 -0.1 -0.3 -0.6 1.4 positive
# 3 c -0.8 -0.6 0.1 0.4 0.7 0.3 -1.3 positive
# 4 d 1.6 -2.2 -2 -0.1 0.6 -1.1 -2.6 positive
# 5 e 0.3 1.1 0.6 -1.4 -0.7 1.4 2 positive
# 6 f -0.8 0 -0.1 -0.4 -0.7 2 -0.9 positive
# 7 g 0.5 0 -0.2 -0.4 0.4 -0.4 0.3 positive
# 8 h 0.7 0.9 -1.5 -0.1 0.8 -1 0.1 positive
# 9 i 0.6 0.8 -0.5 1.1 -0.1 0.6 0.9 positive
# 10 j -0.3 0.6 0.4 0.8 0.9 -0.1 0.7 positive
正如您所看到的,第一部分运行良好,条件的name运行正常,但是条件本身失败了.我非常肯定这与重述语法中第一个新变量有关,该部分用于计算:=
右边的第二个变量,但我不知道如何修复它.我在整理时代的东西上遇到了很大的麻烦,所以任何帮助我都非常感激.我也会听取关于如何更好地命名这篇帖子的建议.