2016-03-29 1 views
0

Используя следующий набор данных:с помощью NSE на spread_ в R tidyr

temp <- structure(list(
    GENDER = structure(c(1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L), 
        .Label = c("F", "M"), 
        class = "factor"), 
    EVERFSM_6 = c(0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L), 
    `0001` = c(0, 11, 22, 33, 33, 55, 66, 77, 88, 0), 
    n = c(20L, 13L, 4L, 13L, 36L, 94L, 28L, 50L, 27L, 1L)), 
    .Names = c("GENDER", "EVERFSM_6", "0001", "n"), 
    class = c("tbl_df", "data.frame"), 
    row.names = c(NA, -10L)) 

И я пытаюсь выполнить следующую операцию spread_ суммировать данные:

DiscID <- "0001" 
colID <- as.name(DiscID) 
cols <- c("GENDER", colID, "n") 

gender_results <- temp %>% 
    select_(.dots=cols) %>% 
    group_by_(.dots=cols[1:2]) %>% 
    summarise(gender_n = sum(n)) %>% 
    spread_(paste0("`",DiscID,"`"), "gender_n") %>% 
    rename(type = GENDER) 

Но он говорит:

Error: Key column '`0001`' does not exist in input. 

Мне нужно использовать _ версию select_, group_by_ и spread_, поскольку я использую переменную в r efer для имен столбцов. Нужный выход ниже, достижимый при использовании жёстко:

spread(`0001`, gender_n) %>% 

    type  0 11 22 33 55 66 77 88 
    (fctr) (int) (int) (int) (int) (int) (int) (int) (int) 
1  F 20 13  4 36 94 28 NA NA 
2  M  1 NA NA 13 NA NA 50 27 

ответ

2

Я думаю, что ваш DiscID уже хорошо для использования с spread_, нет необходимости paste. это помогает?

cols <- c("GENDER", colID, "n") 
gender_results <- temp %>% 
    select_(.dots=cols) %>% 
    group_by_(.dots=cols[1:2]) %>% 
    summarise(gender_n = sum(n)) %>% 
    spread_(DiscID, "gender_n") %>% 
    rename(type = GENDER) 

альтернативно:

cols <- list(~GENDER, colID, ~n) 
gender_results <- temp %>% 
    select_(.dots=cols) %>% 
    group_by_(.dots=cols[1:2]) %>% 
    summarise(gender_n = sum(n)) %>% 
    spread_(DiscID, "gender_n") %>% 
    rename(type = GENDER) 

От NSE vignette in dplyr

+0

это делает! Но теперь я смущен, почему spread_ принимает это, но select_ и group_by_ нет. Благодаря! – pluke

+2

, чтобы использовать такую ​​комбинацию переменных, 'cols' может быть передан как' list (~ GENDER, colID, ~ n) 'вместо (из виньетки NSE в dplyr) –

Смежные вопросы