r - 根据固定字符串和所有可能的顺序值动态改变列
问题描述
我正在构建一个闪亮的应用程序,其中我的数据框中的某些列需要使用简单的线性变换进行变异,但是这些列的总数可以改变,以及这些列在数据框中的位置。但是,列名有一个特定的命名约定,我相信这使得开发动态解决方案成为可能。我只是坚持如何实现这一目标。
以下是我的数据的核心特征:
- 在下面的示例代码中,您将看到几个标有 # 的列。这些是我将用来将其他列变异到我的数据框中的列。
- 在我的 Shiny 应用程序中,这些 a# 列是根据用户选择的输入文件和应用于后端数据的模型动态创建的。
- 这些列始终使用相同的名称(即 a#)生成,其中“a”是常数,而 # 根据我的模型中与当前问题无关的因素按顺序变化。
目标:
- 我希望能够做的是动态地将下面代码中的线性变换应用于可能出现在带有标签 a# 的 df 中的每个潜在值。我有一种预感,这涉及一个监视
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
)
解决方案
尝试这样的事情。
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 创建新变量,同时保留原始变量
推荐阅读
- android - 从谷歌播放更新后应用程序不断崩溃
- dataframe - 将 dict 中的键值对分配给 DataDrame 在 Julia 1.1 中不起作用
- javascript - 与基于类的方法相比,在使用 Hooks 设置状态后重新渲染时有什么区别?
- java - Sparkpost:向同一地址/ Java API 发送电子邮件
- javascript - 这段代码中当前和历史的价值是什么。请解释一下
- java - 如何使用@EntityListeners 记录@Entity 更改?
- elasticsearch - Elasticsearch 中 X-Pack 和 SearchGuard 的区别
- angular - 在 2 个 http 调用完成后 Angular 调用一个函数
- spring - 分离 mongodb 和 postgres 数据源
- ms-access - 基于 2 个特定表条目的自动表单字段更新