在函数

时间:2017-10-21 16:58:00

标签: 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" "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中引用该列。 谁能告诉我这里发生了什么? 有什么好方法可以实现我的目标吗?

2 个答案:

答案 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))))