2014-02-06 4 views
7

Ich versuche, den Code in R: extract maximum value in vector under certain conditions aber ich bekomme immer den Fehlerwie ungültig Index Typ debuggen 'integer' Fehler in R

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

Der Code ist folgendes auszuführen:

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

Haben Sie machen Sicher, dass Copypasting keine Zeilenendezeichen eingeführt hat, die den Codefluss stören könnten? –

+0

Ihr Beispiel funktioniert auch gut für mich. – tonytonov

Antwort

10

Der Beispielcode funktioniert auch für mich. Aber ich habe festgestellt, dass ich einen ähnlichen Fehler repro kann, wenn ich versuche, diese:

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")) 

, das ist, wenn ich "group_by (dat $ id)" anstelle von "group_by (id)" Typ

+0

Ich hatte den gleichen Fehler und konnte ihn wie @schnee korrigieren. anders herum (ich möchte mein Objekt so in einer Liste organisieren, wie es ist) – ano

6

Bug

Der Beispielcode funktioniert auch für mich. Wie bereits erwähnt, können Sie einen ähnlichen Fehler erzeugen, indem Sie group_by (id) durch group_by (dat $ id) ersetzen. Reproduzierbare Code:

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"))) 

Während die erste ist in der Regel nur ein Tippfehler (man kann dat $ x mit x ersetzen), könnte der zweite ein gültiger Anwendungsfall sein (obwohl ich einen Join würde empfehlen, machen es sauberer).

Lösung

Das dplyr Paket nicht wie die Verwendung von '$'. Versuchen Sie stattdessen mit '[', zB:

dat1[,'x'] 

die Variable Zitiert auch funktioniert:

dat1$'x' 

Voll Code:

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"))) 

Siehe auch https://github.com/hadley/dplyr/issues/433 oder https://github.com/hadley/dplyr/issues/1554