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