dplyr 根据向量中的名称改变多列

2024-01-02

我想使用以下方法将两列相乘dplyr's mutate功能。

但是我不想为每个变异条件编写一个新行,而是想使用存储在向量中的列的名称var1 and var2。例如,最后我想在现有的bankdata与名字result1其中包含现金列和贷款列相乘的结果。此操作应持续到创建 3 个新列为止。

可重现的代码:

bankname <- c("Bank A", "Bank B", "Bank C", "Bank D", "Bank E")
bankid <- c(1, 2, 3, 4, 5)
year <- c(1881, 1881, 1881, 1881, 1881)
totass <- c(244789, 195755, 107736, 170600, 32000000)
cash <- c(7250, 10243, 13357, 35000, 351266)
bond <- c(20218, 185151, 177612, 20000, 314012)
loans <- c(29513, 2800, NA, 5000, NA)
bankdata <- data.frame(bankname, bankid, year, totass, cash, bond, loans)

Vectors var1 and var2包含我想要相乘的列名(cash*loans, bond*cash, loans*bankid) and output是新列的名称:

var1 <- c("cash", "bond", "loans")
var2 <- c("loans","cash", "bankid")
output <- c("result1", "result2", "result3")

我想做类似的事情:

bankdata %>%
  mutate_at(.funs = funs(output = var1*var2), vars(var1, var2))

bankdata %>%
  mutate_at(.funs = funs(result1 = cash*., result2 = bond*., result3 = loans*.), vars(var2))

Using tidyeval方法 https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html,我们构建一个函数,它可以将字符串作为输入,然后创建新列。注意使用rlang::sym and !!(嘭嘭)。

之后我们可以使用purrr::pmap_dfc循环通过var1, var2创建其名称由提供的新列output

library(tidyverse)

bankname <- c("Bank A", "Bank B", "Bank C", "Bank D", "Bank E")
bankid <- c(1, 2, 3, 4, 5)
year <- c(1881, 1881, 1881, 1881, 1881)
totass <- c(244789, 195755, 107736, 170600, 32000000)
cash <- c(7250, 10243, 13357, 35000, 351266)
bond <- c(20218, 185151, 177612, 20000, 314012)
loans <- c(29513, 2800, NA, 5000, NA)
bankdata <- data.frame(bankname, bankid, year, totass, cash, bond, loans)

originalNames <- names(bankdata)
var1   <- c("cash", "bond", "loans")
var2   <- c("loans","cash", "bankid")
output <- c("result1", "result2", "result3")

my_mutate <- function(df, var1, var2, output) {      
  var1   <- rlang::sym(var1)
  var2   <- rlang::sym(var2)
  output <- rlang::sym(output)

  df <- df %>% 
    mutate(!! output := !! var1 * !! var2)

  return(df)
}

# test
my_mutate(bankdata, var1[1], var2[1], output[1])

#>   bankname bankid year   totass   cash   bond loans   result1
#> 1   Bank A      1 1881   244789   7250  20218 29513 213969250
#> 2   Bank B      2 1881   195755  10243 185151  2800  28680400
#> 3   Bank C      3 1881   107736  13357 177612    NA        NA
#> 4   Bank D      4 1881   170600  35000  20000  5000 175000000
#> 5   Bank E      5 1881 32000000 351266 314012    NA        NA

# loop through 3 lists simultaneously 
# keep only original and result* columns
pmap_dfc(list(var1, var2, output), ~ my_mutate(bankdata, ..1, ..2, ..3)) %>% 
  select(!! originalNames, starts_with("result"))

#>   bankname bankid year   totass   cash   bond loans   result1      result2
#> 1   Bank A      1 1881   244789   7250  20218 29513 213969250    146580500
#> 2   Bank B      2 1881   195755  10243 185151  2800  28680400   1896501693
#> 3   Bank C      3 1881   107736  13357 177612    NA        NA   2372363484
#> 4   Bank D      4 1881   170600  35000  20000  5000 175000000    700000000
#> 5   Bank E      5 1881 32000000 351266 314012    NA        NA 110301739192
#>   result3
#> 1   29513
#> 2    5600
#> 3      NA
#> 4   20000
#> 5      NA

创建于 2018-04-18代表包 http://reprex.tidyverse.org(v0.2.0)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dplyr 根据向量中的名称改变多列 的相关文章

随机推荐

  • HashLocationStrategy 在路由时不生成 # 个位置?

    我正在运行 Angular 2 beta 0 并且正在搞乱路由 这是我所拥有的 应用程序组件 import Component provide from angular2 core import bootstrap from angular
  • 使用 Vue-router 进行 Firebase 身份验证检查

    问题是 vue router 的 beforeEnter 比 main js 中的 beforeCreate 钩子更早触发 并且有第二个延迟 而在重新加载 vuex 操作后将用户设置为状态 这会导致用户被弹回登录页面 如何延迟 vue ro
  • fork后的变量

    这是一个代码 int i 0 pid t pid puts Hello World puts pid fork if pid i 42 printf p n i printf d n i puts 并输出 Hello World 0x7ff
  • 应用程序关闭时如何处理推送负载?

    我正在向我的用户发送包含以下内容的推送负载 aps alert Go To Google sound Default url http www google com 当应用程序在后台运行时 一切顺利 如果我收到推送并且应用程序已关闭 我打开
  • 使用 imread 函数读取 opencv 中的 jpg 文件时是否有任何可能的原因?

    最近在python中使用opencv 正如我注意到的 当我想导入时cv2python中的模块 我需要添加cv2 so使用以下命令手动将文件路径设置为系统路径 sys path append path to cv so 但是 当我想在 ipy
  • 如何正确设置 django-debug-toolbar 的内部 IP

    我第一次编辑setting py文件输入google cloud computing请原谅我这个愚蠢的问题 我想跑django debug toolbar并遵循该教程中的每一步 我想要的是工具栏在 our office only 所以我只是
  • 如何在 Perl 中轻松解析

    我想将网站解析为 Perl 数据结构 首先我加载页面 use LWP Simple my html get http f oo 现在我知道了两种处理方法 首先是正则表达式 其次是模块 我开始阅读有关HTML 解析器 http p3rl or
  • 从 JSON 中选择随机对象[重复]

    这个问题在这里已经有答案了 我有以下代码 getJSON js questions1 json done function data window questionnaire data console log window question
  • Haskell 中遵守模态公理的有趣运算符

    我只是在看类型map a gt b gt a gt b 这个函数的形状让我想知道我们是否可以将列表形成运算符 视为遵守正常模态逻辑 例如 T S4 S5 B 常见的各种公理 因为我们似乎至少有 K 正规模态逻辑公理 其中 a gt b gt
  • git 从 github 远程存储库导出

    我想从 github 远程存储库导出 而不是克隆它 与 svn export 类似 我不想用它获取 git 文件夹 我可以通过克隆和删除 git 文件夹来解决这个问题 我想知道是否有更清洁的方法 我在某个地方读过它 你可以使用 git ar
  • 流星 $and 与 $or

    我正在尝试在 Meteor 中为我的 mongo 查询执行 and 然后 or 我有以下内容 但它似乎不起作用 希望查询匹配 OrganizationId 键在变量 user organizationId 中具有值且类型键为 convert
  • 将 R 数据表列从 JSON 转换为数据表

    我有一个包含 JSON 数据的列 如下例所示 library data table test lt data table a list 1 2 3 info list duration 10 country US duration 20 c
  • 是否可以在 pdf 中向使用 R knit::kable 生成的表格添加垂直线?

    我想制作一张桌子knitr kable边界上和某些列之间有垂直线 有办法做到吗 我的输出文档是pdf Thanks 不太清楚 但也许这可以帮助 library knitr library kableExtra library dplyr d
  • 如何关闭笔记本中的初始化单元?

    在我的笔记本中 我有一个相当大的初始化单元 如何使其可关闭 我的意思是我怎样才能将这个单元格卷成一行并能够将其展开呢 经典的解决方案是将初始化单元放入其自己的部分 Alt 4 标题为 初始化 此部分位于笔记本的开头或结尾 要隐藏内容 请关闭
  • JDialog 让主应用程序失去焦点

    我想知道为什么我的 JDialog 将我的主应用程序推入后台 这意味着 如果显示 JDialog 并且用户单击 确定 或 取消 则主应用程序将失去焦点并将被推入后台 经过调查 我发现 只有当我在显示 JDialog 时禁用主框架时 才会发生
  • 我的 Apache CXF 客户端出现问题

    我正在尝试编写一个 Apache CXF JAX WS 客户端 我的依赖项pom xml are
  • 如何禁用 html5 canvas 元素的选择

    我监听 html5 画布内的点击事件 它工作得很好 但是 当我单击图像上的任意位置时 浏览器会突出显示该图像 就好像它已被选中一样 类似于在页面上单击时图像可能会突出显示的方式 我很好奇是否有人知道如何禁用选择 html 元素 例如画布 我
  • 在多个转换中保持键控状态

    我有一个流 我想使用某个键对其进行分区 然后运行多个转换 每个转换使用一个状态 当我打电话时keyBy 我得到一个KeyedStream下一个转换可以正确访问分区状态 但之后链接的另一个转换在尝试访问分区状态时会出现异常 例外的是 状态密钥
  • 如何针对集合调用 Expression>

    我有一个从存储库模式定义存储库的接口 interface IRepository List
  • dplyr 根据向量中的名称改变多列

    我想使用以下方法将两列相乘dplyr s mutate功能 但是我不想为每个变异条件编写一个新行 而是想使用存储在向量中的列的名称var1 and var2 例如 最后我想在现有的bankdata与名字result1其中包含现金列和贷款列相