我的数据框架如下:
> 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(结果)并将结果复制到我的代码中时,它可以工作:
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中引用该列。 谁能告诉我这里发生了什么? 有什么好方法可以实现我的目标吗?
答案 0 :(得分:1)
如果您只想命名列,那么您将需要使用反引号(`)。 (它通常与键盘左上角的〜在ESC键下方配对。)请注意,它与单引号(')不同。
您经常将这样的变量写成这样的原因是将包含 spaces 的标题名称导入到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
答案 1 :(得分:0)
您需要取消引用符号!!
:
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))))