首页 > 解决方案 > 根据固定字符串和所有可能的顺序值动态改变列

问题描述

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

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

目标:

谢谢。

代码:

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
  )

标签: rdplyr

解决方案


尝试这样的事情。

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

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

mutate_at()通常用于覆盖vars()参数中列出的项目,添加list(T, ...)to.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

这篇文章有更多信息:使用 mutate_at 创建新变量,同时保留原始变量


推荐阅读