【问题标题】:Using variable name in mutate and coalesce在 mutate 和 coalesce 中使用变量名
【发布时间】:2018-11-02 15:43:03
【问题描述】:

我有以下code 合并两个数据框:

prim <- data.frame("t"=2007:2012,
                   "a"=1:6,
                   "b"=7:12)

secnd <- data.frame("t"=2012:2013,
                    "a"=c(5, 7))

final_df <- prim %>% full_join(secnd, by = 't') %>%
  mutate(a = coalesce(as.integer(a.y),a.x)) %>%
  select(t,a,b)

是否可以使用变量名而不是像上面那样硬编码a?即,是否可以使以下不起作用的代码工作?

var <- "a"
final_df <- prim %>% full_join(secnd, by = 't') %>%
  mutate(var = coalesce(as.integer(var.y),var.x)) %>%
  select(t,var,b)

【问题讨论】:

  • 你想要的输出是什么?

标签: r dplyr


【解决方案1】:

一种选择是使用syms 转换为符号并评估 (!!!)

library(tidyverse)
var <- "a"
prim %>% 
  full_join(secnd, by = "t") %>%
  mutate_at(vars(starts_with(var)), as.integer) %>% 
  transmute(t, !! var := coalesce(!!! rlang::syms(paste0(var, c(".y", ".x")))), b)
#     t a  b
#1 2007 1  7
#2 2008 2  8
#3 2009 3  9
#4 2010 4 10
#5 2011 5 11
#6 2012 5 12
#7 2013 7 NA

【讨论】:

  • @N08 我明白了为什么你得到了不同的结果。列颠倒了
  • @N08 我的意思不是.x, .y,而是.y,.x
  • 前面部分的问题是我按顺序使用了 a.x, a.y。因此,只要存在行有两个非 NA 的情况,就会选择第一个值。
  • @N08 是的,你可以做到。但是使用syms 转换为符号并执行!!!
  • %&gt;% transmute(!!! rlang::syms(vars), !! var := coalesce(!!! rlang::syms(paste0(var, c(".y", ".x")))))
【解决方案2】:

我们可以使用:= 赋值运算符来允许在左侧进行标准评估:

library(dplyr)
library(rlang)

var <- "a"
final_df <- prim %>% full_join(secnd, by = 't') %>%
  mutate(!!var := coalesce(as.integer(!!sym(paste0(var, ".y"))),!!sym(paste0(var, ".x")))) %>%
  select(t,var,b)

【讨论】:

  • 我在运行代码时收到错误Error in sym(paste0(var, ".y")) : could not find function "sym"
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2019-03-10
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多