【问题标题】:NAs introduced by coercion in mutate dplyr while using dynamic column name使用动态列名时在 mutate dplyr 中强制引入的 NA
【发布时间】:2021-06-28 08:09:58
【问题描述】:

我正在使用 dplyr mutate 来计算 2 列之间的排名差异。我正在尝试使用后缀来选择列名,而不是每次都更改它。

suffix1 = ".day"
suffix2 = ".nit"
mergeddf <- left_join(df1, df2, by="col1", suffix = c(suffix1,suffix2)) %>% 
  select(-paste0("Description",suffix2)) %>% 
  mutate(RankDiff = as.numeric(as.character(paste0("Rank",suffix1))) - as.numeric(as.character(paste0("Rank",suffix2)))) %>% 
  arrange(RankDiff)

suffix1suffix2 已完美添加,并在 select 中获取。但在变异中,我收到以下错误:

1:mutate()RankDiff 有问题。 ℹRankDiff = -...。 ℹ 强制 2 引入的 NA:mutate() 列的问题 RankDiff。 ℹRankDiff = -...。 ℹ 强制引入的 NAs

虽然我可以看到,但 RankDiff 的列是由所有 NAs 组成的

然后我将代码更改为:

mutate(RankDiff = paste0("Rank",suffix1) - paste0("Rank",suffix2))

这会产生以下错误:

错误:mutate()RankDiff 有问题。 ℹRankDiff = paste0("Rank", suffix1) - paste0("Rank", suffix2)。 x 非数字 二元运算符的参数

通过替换来获取列的正确方法是什么?

谢谢。

【问题讨论】:

  • In mutate paste0("Rank",suffix1) 不被视为列名,而只是作为字符串。要访问该列,请将字符串包装在其中,例如.data 代词,即.data[paste0("Rank",suffix1)]。有关更多信息,请参阅?`tidyeval-data`
  • x [ 不受 .data 代词支持,请改用 [[ 或 $。因此,我做了.data[[paste0("Rank",suffix1)]]
  • 对不起。当我只是通过评论添加而不是在控制台中自己做时,我有时会忘记这一点。 (;

标签: r dplyr


【解决方案1】:

另一种选择是使用get

library(dplyr) 

mergeddf <- left_join(df1, df2, by="col1", suffix = c(suffix1,suffix2)) %>% 
  select(-paste0("Description",suffix2)) %>% 
  mutate(RankDiff = get(paste0("Rank",suffix1)) - get(paste0("Rank",suffix2))) %>% 
  arrange(RankDiff)

或者使用sym!! -

mergeddf <- left_join(df1, df2, by="col1", suffix = c(suffix1,suffix2)) %>% 
  select(-paste0("Description",suffix2)) %>% 
  mutate(RankDiff = !!sym(paste0("Rank",suffix1)) - !!sym(paste0("Rank",suffix2))) %>% 
  arrange(RankDiff)

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 2018-10-03
    • 1970-01-01
    • 2022-06-13
    • 2021-10-24
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多