根据固定的字符串和所有可能的顺序值动态更改列

时间:2019-05-09 17:23:53

标签: r dplyr

我正在构建一个闪亮的应用程序,其中需要使用简单的线性变换来对数据框中的某些列进行突变,但是这些列的总数以及这些列在数据框中的位置都可以更改。但是,列名具有特定的命名约定,我相信这使开发动态解决方案成为可能。我只是停留在如何实现这个目标上。

以下是我数据的核心特征:

  • 在下面的示例代码中,您将看到几行标记为a#的列。这些是我将用来将其他列突变为数据框的列。
  • 在我的Shiny应用程序中,这些a#列是根据用户选择的输入文件以及应用于后端数据的模型动态创建的。
  • 这些列始终使用相同的名称(即a#)生成,其中'a'是常数,而#根据我的模型中与当前电流无关的因素,顺序地变化题。

目标:

  • 我想做的是将下面代码中的线性变换动态地应用到df中带有标签a#的每个可能值。我有一个预感,其中涉及一个监视字符串的dplyr解决方案,但我更着重于如何获取适合任何a#变量的解决方案。
  • 最好,我要使用一个整洁的解决方案。

谢谢。

代码:

library(tibble)
library(dplyr)


dat <- tibble (
  a1 = rnorm (100, 0, 1),
  b  = rnorm (100, 0, 1),
  a2 = rnorm (100, 0, 1),
  c  = rnorm (100, 0, 1)
)

# single vector working example of the transformation applied to one column (need dynamic version). 

dat <- dat %>%
  mutate(
    a1_T = 10*a1 + 50
  )

1 个答案:

答案 0 :(得分:1)

尝试类似这样的方法。

x10_50 <- function(x) {
  10 * x + 50
}

df <- 
  dat %>%
  mutate_at(vars(matches("^a.$")), .funs = list(T = ~x10_50(.)))

mutate_at()通常用于覆盖vars()参数中列出的项目,将list(T, ...)添加到.funs =将添加新变量。您可以将select()辅助动词放在vars()参数(starts_with()ends_with()one_of())内,也可以将列名的向量作为字符串传递。在这种情况下,我使用了matches(),因为它将接受正则表达式。 ^a.$表示该列将需要以“ a”开头,后跟另一个字符,然后结束。 list(T, ...)将应用您的函数,并将“ _T”附加到返回的变量中。

#       a1      b     a2      c  a1_T  a2_T
#    <dbl>  <dbl>  <dbl>  <dbl> <dbl> <dbl>
#  1.06    0.164 -0.872  1.24   60.6  41.3
# -0.175   0.445  0.330 -2.16   48.2  53.3
#  0.850  -1.67  -0.984 -0.573  58.5  40.2
#  0.0725  0.261  0.681 -1.45   50.7  56.8
#  0.155  -1.16  -0.828 -0.445  51.5  41.7
# -0.818   0.157  0.112  0.715  41.8  51.1

此信息包含更多信息:Create new variables with mutate_at while keeping the original ones