首页 > 解决方案 > 在R中引用一列以将小标题除以

问题描述

我试图将 tibble 中的所有数字列除以 tibble 中的列之一。我可以通过显式编写列的名称来做到这一点,但是我试图将它构造为一个函数,以便我可以将它应用于一个小标题列表。我试图用下面的例子尽可能清楚地解释。

如果这是我的小标题之一:

> data <- tibble(
         ID = sample(letters, 3),
         x = 1:3, 
         y = 9:11, 
         z = y^2-x)


> data

# A tibble: 3 x 4
  ID        x     y     z
  <chr> <int> <int> <dbl>
1 r         1     9    80
2 k         2    10    98
3 f         3    11   118

我想将 x、y 和 z 列除以 z,并且可以通过以下方式执行此操作:

 > data %>% mutate_if(is.numeric, ~ . / z) -> data.new


 > data.new

# A tibble: 3 x 4
  ID         x      y     z
  <chr>  <dbl>  <dbl> <dbl>
1 r     0.0125 0.112      1
2 k     0.0204 0.102      1
3 f     0.0254 0.0932     1

但我不想明确命名列'z'。我希望能够提取名称然后使用它。我试图这样做:

# retrieve name of last column 
> colnames(data)[ncol(data)] -> last.col

# reference the above to perform the division
> data %>% mutate_if(is.numeric, ~ . / last.col) -> data.new2

但我收到以下错误:

Error in ./last.col : non-numeric argument to binary operator

我知道这是因为“last.col”属于字符类,但我不确定如何修复它或继续前进。

我将不胜感激任何建议!

:)

标签: rdplyr

解决方案


您可以在此处通过将 columnn 转换为符号然后评估来使用非标准评估

library(dplyr)
library(rlang)

data %>% mutate(across(where(is.numeric), ~ . /!!sym(last.col)))

# A tibble: 3 x 4
#  ID         x      y     z
#  <chr>  <dbl>  <dbl> <dbl>
#1 c     0.0125 0.112      1
#2 l     0.0204 0.102      1
#3 s     0.0254 0.0932     1

使用mutate_if

data %>% mutate_if(is.numeric, ~ . /!!sym(last.col))

推荐阅读