2014-02-06 1 views
7

Я пытаюсь запустить код в R: extract maximum value in vector under certain conditions, но я получаю ошибкукак отлаживать неверный индекс типа «целое» ошибка в R

Error in list(id.2 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, : 
    invalid subscript type 'integer' 

Код следующее:

require(dplyr) 
dat <- read.table(header = TRUE, text = "id name year job job2 cumu_job2 
1 Jane 1980 Worker 0 0 
1 Jane 1981 Manager 1 1 
1 Jane 1982 Sales 0 0 
1 Jane 1983 Sales 0 0 
1 Jane 1984 Manager 1 1 
1 Jane 1985 Manager 1 2 
1 Jane 1986 Boss 0 0 
2 Bob  1985 Worker 0 0 
2 Bob  1986 Sales 0 0 
2 Bob  1987 Manager 1 1 
2 Bob  1988 Manager 1 2 
2 Bob  1989 Boss 0 0 
3 Jill 1989 Worker 0 0 
3 Jill 1990 Boss 0 0") 

dat %.% 
    group_by(id) %.% 
    mutate(
    all_jobs = sum(unique(job) %in% c("Sales","Manager","Boss")), 
    cumu_max = max(cumu_job2) 
) %.% 
    filter(all_jobs == 3, job %in% c("Sales","Boss")) 

Source: local data frame [5 x 8] 
Groups: id 

    id name year job job2 cumu_job2 all_jobs cumu_max 
1 1 Jane 1982 Sales 0   0  3  2 
2 1 Jane 1983 Sales 0   0  3  2 
3 1 Jane 1986 Boss 0   0  3  2 
4 2 Bob 1986 Sales 0   0  3  2 
5 2 Bob 1989 Boss 0   0  3  2 
+0

Делали ли вы что copypasting не вводит символы конца строки, которые могут нарушить поток кода? –

+0

Ваш пример отлично подходит для меня. – tonytonov

ответ

10

Пример кода работает и для меня. Но я обнаружил, что я могу Репрографический подобную ошибку, если я попытаюсь это:

dat %.% 
group_by(dat$id) %.% 
mutate(
    all_jobs = sum(unique(job) %in% c("Sales","Manager","Boss")), 
    cumu_max = max(cumu_job2) 
) %.% 
filter(all_jobs == 3, job %in% c("Sales","Boss")) 

что, если я типа «group_by (Дат $ ID)» вместо «group_by (ID)»

+0

У меня была такая же ошибка и я смог ее исправить, как @schnee. любым другим способом вокруг этого (я хотел бы, чтобы мой объект был организован в список так, как они есть) – ano

6

Ошибка

Образец кода работает и для меня. Однако, как упоминалось в schnee, вы можете создать аналогичную ошибку, заменив group_by (id) на group_by (dat $ id). Воспроизводимый код:

dat1 <- data.frame(x=c('A','A','B','B'), y=c('A','B','C','D'), val = 1:4) 
dat2 <- data.frame(val = 1:4) 
dat_group <- data.frame(x=c('A','A','B','B')) 

# invalid subscript type 'integer' 
dat1 %>% 
    group_by(dat1$x) %>% 
    mutate(y = sum(unique(y) %in% c("A","B","C"))) 

# invalid subscript type 'list' 
dat2 %>% 
    group_by(dat_group$x) %>% 
    mutate(y = sum(unique(y) %in% c("A","B","C"))) 

В то время как первый один, как правило, просто опечатка (вы можете заменить Даты $ х с й), то вторым может быть допустимым случаем использования (хотя я бы рекомендовал присоединиться, чтобы сделать его чище).

Решение

Пакет dplyr не нравится использование '$'. Попробуйте вместо этого с помощью '[', например:

dat1[,'x'] 

Цитирование переменная также работает:

dat1$'x' 

Полный код:

dat1 %>% 
    group_by(dat1[,'x']) %>% 
    mutate(y = sum(unique(y) %in% c("A","B","C"))) 

dat1 %>% 
    group_by(dat1$'x') %>% 
    mutate(y = sum(unique(y) %in% c("A","B","C"))) 

Смотрите также https://github.com/hadley/dplyr/issues/433 или https://github.com/hadley/dplyr/issues/1554

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