【问题标题】:Converting characters into variable names将字符转换为变量名
【发布时间】:2019-07-22 16:16:19
【问题描述】:

exec_parties2 是一个包含以下 12 个变量的数据框:

“CE”“DB”“ES”“FC”“FF”“HF”“HR”“JE”“JF”“JR”“SE”“SR”

我想创建一个对每个变量进行排名的循环

这是第一个变量的工作示例:

exec_parties2<-exec_parties2 %>% mutate(CE_T=eval(dense_rank(CE)))

我正在尝试这样的事情:

r<-colnames(exec_parties2)

i=1

for(i in r){

  exec_parties3<-exec_parties2 %>% mutate(eval(r[i])=dense_rank(desc(r[i])))   

}

显然,它不起作用

我知道这是可行的,它应该记录在某个地方。我就是找不到。这类似于 SAS 中的宏(编写代码的程序)。

对这个愚蠢的问题表示歉意,非常感谢您的帮助。

【问题讨论】:

  • 试试mutate(!! r[i] := dense_rank(desc(!! rlang::sym(r[i])))
  • 您想创建一个具有不同名称的 new 列,还是改变现有列?如果是后者,请使用mutate_at 而不是 rlang。
  • mutate_at() 可以非常方便地处理这类事情。你甚至可以起新名字。喜欢mutate_at(exec_parties2, r, list(T = ~dense_rank(desc(.) ) ) )
  • 我不知道 dplyr 引用了所有输入。非常感谢!

标签: r dplyr rlang


【解决方案1】:

使用当前的for 循环,我们可以在mutate 内进行赋值(:=),方法是评估(!!),同时将字符串列名转换为符号(sym)并评估(@987654326 @)

r <- colnames(exec_parties2)
for(nm in r) {

    exec_parties2 <- exec_parties2 %>% 
                          mutate(!! nm := dense_rank(desc(!! rlang::sym(nm))))
  }  

注意:就像在 cmets 中一样,这可以通过 mutate_at 轻松完成

【讨论】:

  • mutate 语句中缺少括号。谢谢!。我想要一个新变量,所以我做了:mutate(!! paste0(nm,"_r") := dense_rank(desc(!! rlang::sym(nm))))。我添加了后缀“_r”。谢谢!!!!!!
猜你喜欢
  • 2011-08-27
  • 2010-12-04
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多