字符串转换为符号由dplyr函数接受

问题描述:

我的数据帧的样子:字符串转换为符号由dplyr函数接受

> str(b) 
'data.frame': 2720 obs. of 3 variables: 
$ Hospital.Name: chr "SOUTHEAST ALABAMA MEDICAL CENTER" "MARSHALL MEDICAL CENTER SOUTH" "ELIZA COFFEE MEMORIAL HOSPITAL" "ST VINCENT'S EAST" ... 
$ State  : chr "AL" "AL" "AL" "AL" ... 
$ heart attack : num 14.3 18.5 18.1 17.7 18 15.9 19.6 17.3 17.8 17.5 ... 

我要通过国家团体它,通过国家和心脏病发作对它们进行排序,然后添加返回行号列在每个组中。理想的结果会是什么样子:

# A tibble: 2,720 x 4 
# Groups: State [54] 
         Hospital.Name State `heart attack` rank 
           <chr> <chr>   <dbl> <int> 
1 PROVIDENCE ALASKA MEDICAL CENTER AK   13.4  1 
2   ALASKA REGIONAL HOSPITAL AK   14.5  2 
3  FAIRBANKS MEMORIAL HOSPITAL AK   15.5  3 
4  ALASKA NATIVE MEDICAL CENTER AK   15.7  4 
5 MAT-SU REGIONAL MEDICAL CENTER AK   17.7  5 
6   CRESTWOOD MEDICAL CENTER AL   13.3  1 
7  BAPTIST MEDICAL CENTER EAST AL   14.2  2 
8 SOUTHEAST ALABAMA MEDICAL CENTER AL   14.3  3 
9    GEORGIANA HOSPITAL AL   14.5  4 
10  PRATTVILLE BAPTIST HOSPITAL AL   14.6  5 
# ... with 2,710 more rows 

所以我的代码是:

   outcome<-"heart attack" 
      c<-arrange(b,State,sym(outcome))%>% 
        group_by(State)%>% 
      mutate(rank=row_number(sym(outcome))) 

,但我得到这个错误:

Error in arrange_impl(.data, dots) : object 'heart attack' not found 

当我跑符号(结果)独立和复制结果到我的代码,它的工作原理:

sym(outcome) 
`heart attack` 
c<-arrange(b,State,`heart attack`)%>% 
+       group_by(State)%>% 
+     mutate(rank=rank(`heart attack`)) 
> c 
# A tibble: 2,720 x 4 
# Groups: State [54] 
         Hospital.Name State `heart attack` rank 
           <chr> <chr>   <chr> <dbl> 
1 PROVIDENCE ALASKA MEDICAL CENTER AK   13.4  1 
2   ALASKA REGIONAL HOSPITAL AK   14.5  2 
3  FAIRBANKS MEMORIAL HOSPITAL AK   15.5  3 
4  ALASKA NATIVE MEDICAL CENTER AK   15.7  4 
5 MAT-SU REGIONAL MEDICAL CENTER AK   17.7  5 
6   CRESTWOOD MEDICAL CENTER AL   13.3  1 
7  BAPTIST MEDICAL CENTER EAST AL   14.2  2 
8 SOUTHEAST ALABAMA MEDICAL CENTER AL   14.3  3 
9    GEORGIANA HOSPITAL AL   14.5  4 
10  PRATTVILLE BAPTIST HOSPITAL AL   14.6  5 
# ... with 2,710 more rows 

这是函数的一部分,所以'结果'需要是一个字符串。因此,我试图将字符串转换为符号,以便可以引用dplyr中的列。 任何人都可以告诉我这里发生了什么? 有没有什么好方法可以实现我的目标?

您需要所享有符号与!!

arrange(b, State, !!sym(outcome)) 

或者UQ

arrange(b, State, UQ(sym(outcome))) 

同样为mutate

mutate(rank=row_number(!!sym(outcome))) # or mutate(rank=row_number(UQ(sym(outcome)))) 
+0

感谢〜 但我仍然不是很清楚,因为它将sym(结果)的结果直接粘贴到我的代码中。 我的理解是sym(结果)可以返回正确的结果,但为了使其被dplyr接受,我必须把!!或UQ()在前面?我对吗? – Yin

+0

这是正确的。从文档中,UQ'在周围环境中立即评估符号。“由于变量的上下文是隐含的,它需要这个“UQ”过程来确保变量从数据框而不是全局环境推断出来。 – Psidom

如果你只是想名字该列,那么你会想要使用反引号(`)。 (它通常与ESC键下方的键盘左上角的〜配对。)请注意,它与单引号(')不同。

你经常会得到你的变量这样写的原因是从导入包含空间到tibbles头名。任何包含空格的标题名称都会被包装在`中。您需要通过将它们包装成反引号来引用这些列,否则R不会识别出您正在引用它可以使用的内存中的对象。它只会认为你指的是字符串而不是内存中的对象。 。虽然这将物体愉快地存储在其名称中的空格,如果你使用“或”

请参见下面的问题的演示:

`tidy time` <- 4 
'tidy time' <- 5 
"tidy time" <- 6 
print('tidy time') 
print("tidy time") 
print(`tidy time`) 

这是对R的错误信息的原因

希望能够理解所有这些将使您无需致电sym功能,无论如何,如果您删除名称中的空格,问题也将消失,并且您可以将反引号保存另一天

要学习更多关于 !!和unquoting变量(psidom指的是在他的回答),并且还可以了解发生在编写函数依赖于dplyr非标准评估引用对象,请在这里看到相关的问题:https://rpubs.com/hadley/dplyr-programming