2017-10-21 72 views
2

我的數據幀的樣子:字符串轉換爲符號由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中的列。 任何人都可以告訴我這裏發生了什麼? 有沒有什麼好方法可以實現我的目標?

回答

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)))) 
+0

感謝〜 但我仍然不是很清楚,因爲它將sym(結果)的結果直接粘貼到我的代碼中。 我的理解是sym(結果)可以返回正確的結果,但爲了使其被dplyr接受,我必須把!!或UQ()在前面?我對嗎? – Yin

+0

這是正確的。從文檔中,UQ'在周圍環境中立即評估符號。「由於變量的上下文是隱含的,它需要這個「UQ」過程來確保變量從數據框而不是全局環境推斷出來。 – Psidom

1

如果你只是想名字該列,那麼你會想要使用反引號(`)。 (它通常與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