正如你可能已经猜到的那样,我很难描述这个问题.我想通过对现有列的子集求和来计算一个新变量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".这部分我能做到.下一步是使用新创建的变量创建一个新的条件变量,在本例中,如果三个变量的和为&gt;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运行正常,但是条件本身失败了.我非常肯定这与重述语法中第一个新变量有关,该部分用于计算:=右边的第二个变量,但我不知道如何修复它.我在整理时代的东西上遇到了很大的麻烦,所以任何帮助我都非常感激.我也会听取关于如何更好地命名这篇帖子的建议.

推荐答案

这就是我解决问题的办法.

  • 我会使用rowSums,而不是rowwisesum.
  • 当在第二个条件!!paste0(drug, "_total")中 Select 列不正确时,请改用.data.
library(dplyr)

sumFunct <- function(data, drug) {
  d %>%
    mutate(!!paste0(drug, "_total") := rowSums(pick(contains(drug))),
           !!paste0(drug, "_any") := factor(
             case_when(.data[[paste0(drug, "_total")]] > 0 ~ "positive",
                       TRUE ~ "negative"),levels = c("negative","positive")))
}

sumFunct(d, "cann")
#   id q1_cann_a q1_cann_b q1_cann_c q1_alc_a q1_alc_b q1_alc_c cann_total cann_any
#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 negative
#4   d       1.6      -2.2      -2.0     -0.1      0.6     -1.1       -2.6 negative
#5   e       0.3       1.1       0.6     -1.4     -0.7      1.4        2.0 positive
#6   f      -0.8       0.0      -0.1     -0.4     -0.7      2.0       -0.9 negative
#7   g       0.5       0.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        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

在您的方法中,如果您按照第二点进行更改,它应该也会起作用.

R相关问答推荐

具有多个依赖变量/LHS的逻辑模型

如何删除多个.CSV文件的行

如何使用R Shiny中的条件面板仅隐藏和显示用户输入,同时仍允许运行基础计算?

随机森林回归:下拉列重要性

如何计算前一行的值,直到达到标准?

警告:lmdif:info = 0. nls. lm()函数的输入参数不正确

如何在格子中添加双曲曲线

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

在GGPLATE中将突出的点放在前面

R s iml包如何处理语法上无效的因子级别?'

R中插入符号训练函数的中心因子和尺度因子预测

如何将一个方阵分解成没有循环的立方体

将工作目录子文件夹中的文件批量重命名为顺序

在不对R中的变量分组的情况下取两行的平均值

根据r中每行中的日期序列,使用列名序列创建新列

名字的模糊匹配

分隔日期格式为2020年7月1日

如何使用list_rind在列表中保留已命名但不包含第0行的记录?

将日期列从字符转换为日期得到的结果是NAS

基于已有ID列创建唯一ID