обобщаване на стойностите на символите с ddply

Имам следната рамка от данни:

df <- structure(list(year = c(1986L, 1987L, 1991L, 1991L, 1991L, 1991L, 1992L, 1992L, 1992L, 1992L, 1992L, 1992L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L, 1994L), knmilocatie = structure(c(4L, 16L, 10L, 12L, 9L, 20L, 12L, 12L, 25L, 9L, 30L, 26L, 22L, 18L, 15L, 24L, 13L, 31L, 27L, 5L, 3L, 19L, 21L, 23L, 20L, 26L, 26L, 31L, 35L, 25L, 11L, 28L, 8L, 29L, 36L, 34L, 7L, 28L, 17L, 14L, 33L, 1L, 11L, 6L, 32L, 27L, 29L, 20L, 20L, 2L), .Label = c("Achterdiep", "Annen", "Appingedam", "Assen", "Bedum", "De Klip", "Delfzijl", "Eenrum", "Eleveld", "Emmen", "Garsthuizen", "Geelbroek", "Haren", "Hellum", "Hoogezand", "Hooghalen", "Kolham", "Langelo", "Loppersum", "Middelstum", "Nijenklooster", "Noordbroek", "Oldenzijl", "Overschild", "Roswinkel", "Slochteren", "Stedum", "Steendam", "t-Zandt", "Ten Boer", "Ten Post", "Uithuizermeeden", "Weiwerd", "Westerbroek", "Winneweer", "Zandeweer"), class = "factor"), baglocatie = structure(c(2L, 12L, 5L, 4L, 2L, 17L, 11L, 2L, 21L, 2L, 16L, 35L, 27L, 14L, 22L, 19L, 33L, 34L, 26L, 17L, 1L, 18L, 1L, 28L, 6L, 25L, 25L, 29L, 9L, 21L, 10L, 19L, 34L, 15L, 36L, 13L, 7L, 19L, 8L, 23L, 7L, 31L, 17L, 1L, 20L, 3L, 10L, 32L, 30L, 24L), .Label = c("Appingedam", "Assen", "Bedum", "Ekehaar", "Emmen", "Eppenhuizen", "Farmsum", "Froombosch", "Garrelsweer", "Garsthuizen", "Geelbroek", "Hooghalen", "Kolham", "Langelo", "Leermens", "Loppersum", "Middelstum", "Oosterwijtwerd", "Overschild", "Roodeschool", "Roswinkel", "Sappemeer", "Schildwolde", "Schipborg", "Slochteren", "Stedum", "Steendam", "t-Zandt", "Ten Post", "Toornwerd", "Tripscompagnie", "Warffum", "Westerbroek", "Wirdum", "Woudbloem", "Zandeweer"), class = "factor"), lllocatie = structure(c(3L, 13L, 5L, 10L, 4L, 32L, 10L, 10L, 22L, 4L, 36L, 37L, 31L, 15L, 23L, 20L, 34L, 8L, 24L, 35L, 19L, 19L, 2L, 29L, 26L, 25L, 25L, 30L, 8L, 22L, 9L, 20L, 19L, 16L, 38L, 12L, 6L, 27L, 7L, 11L, 17L, 33L, 14L, 2L, 21L, 18L, 9L, 28L, 32L, 1L), .Label = c("Annen", "Appingedam", "Assen", "Eleveld", "Emmen", "Farmsum", "Froombosch", "Garrelsweer", "Garsthuizen", "Geelbroek", "Hellum", "Hoogezand", "Hooghalen", "Huizinge", "Langelo", "Leermens", "Meedhuizen", "Onderdendam", "Oosterwijtwerd", "Overschild", "Roodeschool", "Roswinkel", "Sappemeer", "Sint Annen", "Slochteren", "Startenhuizen", "Steendam", "Stitswerd", "t-Zandt", "Ten Post", "Tjuchem", "Toornwerd", "Tripscompagnie", "Westerbroek", "Westerwijtwerd", "Winneweer", "Woudbloem", "Zandeweer"), class = "factor")), .Names = c("year", "knmilocatie", "baglocatie", "lllocatie"), class = "data.frame", row.names = c(NA, -50L))

Искам да го обобщя по години. За всяка година, от която се нуждая, броят на екземплярите беше baglocatie != knmilocatie, baglocatie != lllocatie и lllocatie != knmilocatie.

Опитах:

unequal <- ddply(df, .(year), summarise,
                 bag.knmi = nrow(df[as.character(df$baglocatie) != as.character(df$knmilocatie),]),
                 bag.ll = nrow(df[as.character(df$baglocatie) != as.character(df$lllocatie),]),
                 ll.knmi = nrow(df[as.character(df$lllocatie) != as.character(df$knmilocatie),])
                 )

Това обаче не върна желания резултат. За всяка година дава общите суми за цялата рамка от данни. Опитах също length вместо nrow, но и това не проработи. какво ми липсва

Желаният резултат трябва да изглежда така:

year  bag.knmi  bag.ll  ll.knmi
1986  0         0       0
1987  0         0       0
1991  2         3       1
1992  4         3       2

Освен това искам да знам дали този проблем може да бъде решен и с dplyr.


person Jaap    schedule 25.03.2014    source източник


Отговори (1)


Просто не използвате summarise правилно:

unequal <- ddply(df, .(year), summarise,
                 bag.knmi = sum(as.character(baglocatie) != as.character(knmilocatie)),
                 bag.ll = sum(as.character(baglocatie) != as.character(lllocatie)),
                 ll.knmi = sum(as.character(lllocatie) != as.character(knmilocatie))
                 )

Всичко след summarise се оценява в контекста на всяка част от вашите данни. Ако изрично посочите колони в оригиналния кадър с данни, това ще получите: целия кадър с данни, а не частите.

И да, разбира се, това може да се направи и в dplyr:

df %>% 
    group_by(year) %>% 
    summarise(bag.knmi = sum(as.character(baglocatie) != as.character(knmilocatie)))
person joran    schedule 25.03.2014
comment
Кодът може да бъде малко опростен чрез избягване на фактори - person hadley; 26.03.2014