2014-03-02 48 views
-1

我要融化一個數據幀到長格式基於在一個字符串變量中的唯一值。一些示例性數據:重塑數據幀值

df1 <- structure(list(lllocatie = structure(c(3L, 13L, 5L, 10L, 4L, 32L, 10L, 10L, 22L, 4L, 36L, 37L, 31L, 15L, 23L, 20L, 34L, 8L, 35L, 24L, 19L, 19L, 2L, 29L, 26L, 25L, 25L, 30L, 8L, 22L, 9L, 20L, 19L, 12L, 16L, 38L, 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"), lat = c(52.992, 52.928, 52.771, 52.952, 52.965, 53.358, 52.953, 52.956, 52.831, 52.961, 53.32, 53.21, 53.294, 53.084, 53.16, 53.285, 53.177, 53.305, 53.316, 53.315, 53.333, 53.336, 53.332, 53.363, 53.368, 53.208, 53.202, 53.294, 53.306, 52.833, 53.37, 53.279, 53.323, 53.17, 53.345, 53.39, 53.316, 53.275, 53.194, 53.226, 53.294, 53.156, 53.359, 53.335, 53.423, 53.324, 53.372, 53.365, 53.351, 53.061), lon = c(6.548, 6.552, 6.914, 6.575, 6.573, 6.657, 6.572, 6.562, 7.032, 6.57, 6.74, 6.747, 6.868, 6.465, 6.805, 6.795, 6.685, 6.793, 6.65, 6.66, 6.837, 6.808, 6.848, 6.765, 6.675, 6.812, 6.82, 6.753, 6.777, 7.045, 6.72, 6.807, 6.805, 6.747, 6.808, 6.68, 6.962, 6.828, 6.798, 6.835, 6.95, 6.823, 6.682, 6.852, 6.77, 6.613, 6.743, 6.577, 6.628, 6.698), mag.cat = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 3L, 3L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 3L, 2L, 2L, 3L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 3L, 2L, 2L, 3L, 3L), names = structure(c(3L, 4L, 9L, 2L, 2L, 11L, 2L, 8L, 10L, 2L, 21L, 29L, 1L, 19L, 1L, 24L, 28L, 1L, 1L, 1L, 23L, 23L, 1L, 27L, 12L, 1L, 15L, 17L, 16L, 10L, 1L, 24L, 1L, 1L, 20L, 14L, 1L, 25L, 1L, 1L, 1L, 1L, 18L, 1L, 22L, 7L, 13L, 26L, 6L, 5L), .Label = c("", "Amen,Assen,Deurze,Ekehaar,Eleveld,Geelbroek,Hooghalen,Marwijksoord,Vredenheim", "Amen,Assen,Deurze,Ekehaar,Eleveld,Geelbroek,Taarlo,Ubbena", "Amen,Ekehaar,Eleveld,Geelbroek,Hooghalen", "Annen,Gasteren,Nieuw Annerveen,Oud Annerveen,Schipborg,Zeegse,Zuidlaren","Bedum,Eppenhuizen,Garsthuizen,Huizinge,Kantens,Middelstum,Onderdendam,Rottum,Sint Annen,Startenhuizen,Stedum,Stitswerd,Tinallinge,Toornwerd,Uithuizen,Usquert,Warffum,Westeremden,Westerwijtwerd,Zandeweer", "Bedum,Huizinge,Kantens,Lellens,Middelstum,Onderdendam,Rottum,Sauwerd,Sint Annen,Stedum,Stitswerd,Thesinge,Tinallinge,Toornwerd,Westeremden,Westerwijtwerd,Wetsinge,Winsum", "Eleveld,Geelbroek", "Emmen", "Emmer-Compascuum,Roswinkel", "Eppenhuizen,Garsthuizen,Huizinge,Kantens,Middelstum,Oldenzijl,Onderdendam,Rottum,Startenhuizen,Stedum,Stitswerd,Toornwerd,Uithuizen,Westeremden,Westerwijtwerd,Zandeweer","Eppenhuizen,Garsthuizen,Huizinge,Kantens,Middelstum,Oldenzijl,Rottum,Startenhuizen,Toornwerd,Westeremden,Zandeweer", "Eppenhuizen,Garsthuizen,Oldenzijl,Startenhuizen,t-Zandt,Westeremden,Zeerijp,Zijldijk", "Eppenhuizen,Oldenzijl,Startenhuizen,Uithuizen,Zandeweer", "Froombosch,Hellum,Noordbroek,Sappemeer,Schildwolde,Slochteren", "Garrelsweer", "Garrelsweer,Overschild,Ten Post,Winneweer", "Huizinge,Startenhuizen", "Langelo", "Leermens,Oosterwijtwerd", "Loppersum,Winneweer", "Oosteinde,Roodeschool", "Oosterwijtwerd", "Overschild", "Steendam", "Stitswerd", "t-Zandt,Zeerijp", "Westerbroek", "Woudbloem"), class = "factor")), .Names = c("lllocatie", "lat", "lon", "mag.cat", "names"), class = "data.frame", row.names = c(NA, -50L)) 

的觀察,其中names柱是空的,必須從數據幀新排除。當你在第一排看,例如:

lllocatie lat lon mag.cat              names 
    Assen 52.992 6.548  3 Amen,Assen,Deurze,Ekehaar,Eleveld,Geelbroek,Taarlo,Ubbena 

在重構數據框應導致以下所需的輸出該行:

lllocatie lat lon mag.cat  names 
    Assen 52.992 6.548  3  Amen 
    Assen 52.992 6.548  3  Assen 
    Assen 52.992 6.548  3 Deurze 
    Assen 52.992 6.548  3 Ekehaar 
    Assen 52.992 6.548  3 Eleveld 
    Assen 52.992 6.548  3 Geelbroek 
    Assen 52.992 6.548  3 Taarlo 
    Assen 52.992 6.548  3 Ubbena 

的觀察,其中names欄是空的,必須從重新整形的數據框中排除。任何想法如何做到這一點?

+0

這是一種地理編碼數據。你的融化數據框將有一個lat,long和mag.cat爲每個位置?對於單行,所有地方都會有陰影座標。那是你在找什麼? –

+0

@亨利克這確實給我的問題一個答案。另一方面,jlhoward的答案提供了一個很好的替代解決方案。由於jlhoward的方法更容易理解,我認爲這個問題和答案對於SO來說是一個有價值的補充。 – Jaap

回答

1
library(data.table) 
dt <- data.table(df1) 
result <- dt[,strsplit(as.character(names),",",fixed=T), 
       by=list(lllocatie,lat,lon,mag.cat)] 
head(result,10) 
#  lllocatie lat lon mag.cat  V1 
# 1:  Assen 52.992 6.548  3  Amen 
# 2:  Assen 52.992 6.548  3  Assen 
# 3:  Assen 52.992 6.548  3 Deurze 
# 4:  Assen 52.992 6.548  3 Ekehaar 
# 5:  Assen 52.992 6.548  3 Eleveld 
# 6:  Assen 52.992 6.548  3 Geelbroek 
# 7:  Assen 52.992 6.548  3 Taarlo 
# 8:  Assen 52.992 6.548  3 Ubbena 
# 9: Hooghalen 52.928 6.552  3  Amen 
# 10: Hooghalen 52.928 6.552  3 Ekehaar 
+0

我編輯了我的問題。希望它能夠描述我現在想要實現的更好。 – Jaap

+0

我編輯了我的回覆。恭喜@BrodieG讓我意識到data.tables這個非常好用的功能。 – jlhoward