将字符串转换为函数中dplyr接受的符号

将字符串转换为函数中dplyr接受的符号,r,dplyr,R,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"

我的数据框看起来像:

> 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
当我独立运行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
sym(结果)
`心脏病发作`
c%
+按(州)分组%>%
+变异(秩=秩(`心脏病发作')
>c
#A tibble:2720x4
#分组:国家[54]
医院。命名州“心脏病发作”等级
1普罗维登斯阿拉斯加医疗中心AK 13.4 1
2阿拉斯加地区医院AK 14.5 2
3费尔班克斯纪念医院AK 15.5 3
4阿拉斯加土著医疗中心AK 15.7 4
5 MAT-SU地区医疗中心AK 17.7 5
6克雷斯特伍德医疗中心AL 13.3 1
7东部浸礼会医疗中心14.2 2
8阿拉巴马州东南医疗中心AL 14.3 3
9乔治亚那医院AL 14.5 4
10普拉特维尔浸信会医院AL 14.6 5
# ... 还有2710行
这是函数的一部分,因此“结果”必须是字符串。因此,我尝试将字符串转换为符号,以便可以引用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键正下方的~配对。)请注意,这与单引号(')不同

经常这样编写变量的原因是将包含空格的标题名导入到TIBLES中。任何包含空格的标题名都会被包装在`。您需要引用这些列,方法是同时将它们包装在反勾号中,否则R无法识别您引用的是内存中可以使用的对象。它只会认为您引用的是字符串,而不是内存中的对象。尽管如果您使用“或”,它会很高兴地在其名称中存储一个空格

请参见下面的问题演示:

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

`tidy time`谢谢~但我还是不太清楚,因为当我将sym(结果)的结果直接粘贴到我的代码中时,它会起作用。我的理解是sym(结果)可以返回正确的结果,但为了让dplyr接受它,我必须放入!!或UQ()前面?我说得对吗?这是正确的。从文档中可以看出,UQ
会立即在周围的上下文中计算符号。
。由于变量的上下文是隐式的,因此需要此
UQ
过程来确保变量从数据帧而不是全局环境推断。
mutate(rank=row_number(!!sym(outcome)))   # or mutate(rank=row_number(UQ(sym(outcome))))
`tidy time` <- 4
'tidy time' <- 5
"tidy time" <- 6
print('tidy time')
print("tidy time")
print(`tidy time`)