字符串转换为符号由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))))
答
如果你只是想名字该列,那么你会想要使用反引号(`)。 (它通常与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
感谢〜 但我仍然不是很清楚,因为它将sym(结果)的结果直接粘贴到我的代码中。 我的理解是sym(结果)可以返回正确的结果,但为了使其被dplyr接受,我必须把!!或UQ()在前面?我对吗? – Yin
这是正确的。从文档中,UQ'在周围环境中立即评估符号。“由于变量的上下文是隐含的,它需要这个“UQ”过程来确保变量从数据框而不是全局环境推断出来。 – Psidom