【问题标题】:R: in for loop, using mutate to compute the difference between two variables dynamicallyR:在for循环中,使用mutate动态计算两个变量之间的差异
【发布时间】:2021-11-19 05:22:11
【问题描述】:

目的

假设我有四个变量:两个变量是原始变量,另外两个变量是原始变量的预测。 (在实际数据中,原始变量的数量更多)

我想使用for loopmutate 创建计算原始变量和预测变量之间差异的列。样本数据和当前方法如下:

样本数据

  set.seed(10000)
  id <- sample(1:20, 100, replace=T)
  set.seed(10001)
  dv.1 <- sample(1:20, 100, replace=T)
  set.seed(10002)
  dv.2 <- sample(1:20, 100, replace=T)
  set.seed(10003)
  pred_dv.1 <- sample(1:20, 100, replace=T)
  set.seed(10004)
  pred_dv.2 <- sample(1:20, 100, replace=T)
  
  d <-   
    data.frame(id, dv.1, dv.2, pred_dv.1, pred_dv.2) 

当前方法(有错误)

 original <- d %>% select(starts_with('dv.'))  %>% names(.) 
  
  pred <- d %>% select(starts_with('pred_dv.')) %>% names(.) 
  
  for (i in 1:length(original)){
    d <-
      d %>% 
      mutate(diff = original[i] - pred[i])
  
    l <- length(d)
    
    colnames(d[l])  <- paste0(original[i], '.diff')

  }

错误:mutate() 输入 diff 有问题。 # x 非数字 二元运算符的参数 # ℹ 输入 difforiginal[i] - pred[i]

【问题讨论】:

  • chain_sort 来自哪里?
  • @TarJae 很抱歉造成混乱!这是一个自定义函数。

标签: r for-loop dplyr


【解决方案1】:

减法可以直接应用于数据帧。

因此,您可以创建一个原始列名向量和另一个预测列名向量,然后将它们相减以创建新列。

orig_var <- grep('^dv', names(d), value = TRUE)
pred_var <- grep('pred', names(d), value = TRUE)
d[paste0(orig_var, '.diff')] <- d[orig_var] - d[pred_var]
d

#    id dv.1 dv.2 pred_dv.1 pred_dv.2 dv.1.diff dv.2.diff
#1   15    5    1         5        15         0       -14
#2   13    4    4         5        11        -1        -7
#3   12   20   13         6        13        14         0
#4   20   11    8        13         3        -2         5
#5    9   11   10         7        13         4        -3
#...
#...

【讨论】:

  • 感谢您的回复,但我想使用 dplyr 来实现它,而 Vinícius 的代码提供了解决方案。再次感谢您。
【解决方案2】:
d %>% 
  mutate(
    across(
      .cols = starts_with("dv"),
      .fns = ~ . - (get(paste0("pred_",cur_column()))),
      .names = "diff_{.col}"
        )
  )

# A tibble: 100 x 7
     id  dv.1  dv.2 pred_dv.1 pred_dv.2 diff_dv.1 diff_dv.2
   <int> <int> <int>     <int>     <int>    <int>    <int>
 1    15     5     1         5        15        0      -14
 2    13     4     4         5        11       -1       -7
 3    12    20    13         6        13       14        0
 4    20    11     8        13         3       -2        5
 5     9    11    10         7        13        4       -3
 6    13     3     3         6        17       -3      -14
 7     3    12    19         6        17        6        2
 8    19     6     7        11         4       -5        3
 9     6     7    12        19         6      -12        6
10    13    10    15         6         7        4        8
# ... with 90 more rows

【讨论】:

  • 感谢您的回复。没错,但在实际数据中,原始变量和预测变量更多。我正在尝试制作一个自定义函数,无论原始变量和预测变量的数量如何,它都会自动创建这些差异列。
  • 他们的名字中都有一个模式?如果是这样,我会更新我的答案以自动为所有这些人做到这一点
  • 是的!这达到了我的目标。 @Vinícius Félix,非常感谢。
猜你喜欢
  • 2019-06-17
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多