Given a data frame consisting of a pointID and 12 pairs of (lat, long) variables, with names latA, longA, latB, longB, ... latL, longL, I want to reshape it into a data frame with the structure point source lat long 1 A ... ... 1 B ... ... I've looked at reshape and plyr, but can't figure out how to do this. Details of my data frame are below > dput(head(maps)) structure(list(point = 1:6, latA = c(41.68, 41.9, 42.25, 42.55, 44.05, 43.65), longA = c(82.85, 82.52, 81.92, 80.03, 83.03, 83.95 ), latB = c(41.62, 42.12, 42.07, 42.47, 43.42, 43.12), longB = c(87.67, 87, 85.97, 84.17, 87.25, 87.92), latC = c(-41.12, 41.88, 42.13, 42.13, 44.23, 43.25), longC = c(-83.03, 82, 80.78, 79.55, 83.6, 84.48), latD = c(-41.03, 41.87, 41.98, 42, 44.13, 43.8), longD = c(-85.1, 85.37, 83.78, 83.18, 86.85, 87.1), latE = c(41.28, 42.08, 42.22, 42.07, 44.6, 43.72), longE = c(82.42, 81.17, 80.2, 80.27, 83.5, 83.23), latF = c(43.13, 42.35, 42.62, 42.83, 44.62, 43.62), longF = c(82.25, 81.77, 81.37, 79.92, 85.5, 85.25), latG = c(42.05, 42.23, 42.37, 42.37, 44.75, 44.03), longG = c(82.88, 82.35, 81.3, 80.03, 83.57, 83.47), latH = c(42.15, 42.38, 42.53, 42.87, 44.47, 44.03), longH = c(81.63, 80.78, 80.35, 78.73, 81.75, 81.72), latI = c(42.03, 42.25, 42.33, 42.33, 44.75, 44.03), longI = c(83.53, 82.45, 81.98, 80.65, 84.33, 84.22), latJ = c(42.02, 42.12, 42.5, 42.68, 44.35, 44.07), longJ = c(82.9, 82.42, 81.87, 80.15, 82.9, 83.6), latK = c(42, 42.08, 42.48, 42.67, 44.32, 44.03), longK = c(82.9, 82.37, 81.87, 80.18, 82.9, 83.57), latL = c(-41.12, 42, 42.32, 42.55, 44.27, -44.07), longL = c(-82.12, 82.08, 81.75, 80.08, 83, -83.12)), .Names = c("point", "latA", "longA", "latB", "longB", "latC", "longC", "latD", "longD", "latE", "longE", "latF", "longF", "latG", "longG", "latH", "longH", "latI", "longI", "latJ", "longJ", "latK", "longK", "latL", "longL"), row.names = c(NA, 6L), class = "data.frame") -- Michael Friendly Email: friendly AT yorku DOT ca Professor, Psychology Dept. York University Voice: 416 736-5115 x66249 Fax: 416 736-5814 4700 Keele Street http://www.math.yorku.ca/SCS/friendly.html Toronto, ONT M3J 1P3 CANADA
Michael - I think this call to reshape gets you pretty close:> reshape(maps,direction='long',+ varying=list(grep('lat',names(dat),value=TRUE), + grep('long',names(dat),value=TRUE)), + times=LETTERS[1:12]) point time latA longA id 1.A 1 A 41.68 82.85 1 2.A 2 A 41.90 82.52 2 3.A 3 A 42.25 81.92 3 4.A 4 A 42.55 80.03 4 5.A 5 A 44.05 83.03 5 . . . - Phil Spector Statistical Computing Facility Department of Statistics UC Berkeley spector at stat.berkeley.edu On Tue, 3 Nov 2009, Michael Friendly wrote:> Given a data frame consisting of a pointID and 12 pairs of (lat, long) > variables, with names > latA, longA, latB, longB, ... latL, longL, I want to reshape it into a data > frame with the structure > > point source lat long > 1 A ... ... > 1 B ... ... > > I've looked at reshape and plyr, but can't figure out how to do this. > Details of my data frame are below > >> dput(head(maps)) > structure(list(point = 1:6, latA = c(41.68, 41.9, 42.25, 42.55, > 44.05, 43.65), longA = c(82.85, 82.52, 81.92, 80.03, 83.03, 83.95 > ), latB = c(41.62, 42.12, 42.07, 42.47, 43.42, 43.12), longB = c(87.67, > 87, 85.97, 84.17, 87.25, 87.92), latC = c(-41.12, 41.88, 42.13, > 42.13, 44.23, 43.25), longC = c(-83.03, 82, 80.78, 79.55, 83.6, > 84.48), latD = c(-41.03, 41.87, 41.98, 42, 44.13, 43.8), longD = c(-85.1, > 85.37, 83.78, 83.18, 86.85, 87.1), latE = c(41.28, 42.08, 42.22, > 42.07, 44.6, 43.72), longE = c(82.42, 81.17, 80.2, 80.27, 83.5, > 83.23), latF = c(43.13, 42.35, 42.62, 42.83, 44.62, 43.62), longF = c(82.25, > 81.77, 81.37, 79.92, 85.5, 85.25), latG = c(42.05, 42.23, 42.37, > 42.37, 44.75, 44.03), longG = c(82.88, 82.35, 81.3, 80.03, 83.57, > 83.47), latH = c(42.15, 42.38, 42.53, 42.87, 44.47, 44.03), longH = c(81.63, > 80.78, 80.35, 78.73, 81.75, 81.72), latI = c(42.03, 42.25, 42.33, > 42.33, 44.75, 44.03), longI = c(83.53, 82.45, 81.98, 80.65, 84.33, > 84.22), latJ = c(42.02, 42.12, 42.5, 42.68, 44.35, 44.07), longJ = c(82.9, > 82.42, 81.87, 80.15, 82.9, 83.6), latK = c(42, 42.08, 42.48, > 42.67, 44.32, 44.03), longK = c(82.9, 82.37, 81.87, 80.18, 82.9, > 83.57), latL = c(-41.12, 42, 42.32, 42.55, 44.27, -44.07), longL = c(-82.12, > 82.08, 81.75, 80.08, 83, -83.12)), .Names = c("point", "latA", > "longA", "latB", "longB", "latC", "longC", "latD", "longD", "latE", > "longE", "latF", "longF", "latG", "longG", "latH", "longH", "latI", > "longI", "latJ", "longJ", "latK", "longK", "latL", "longL"), row.names = > c(NA, > 6L), class = "data.frame") > > -- > Michael Friendly Email: friendly AT yorku DOT ca Professor, Psychology > Dept. > York University Voice: 416 736-5115 x66249 Fax: 416 736-5814 > 4700 Keele Street http://www.math.yorku.ca/SCS/friendly.html > Toronto, ONT M3J 1P3 CANADA > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
Try this:> require(reshape) > # melt the data > x <- melt(maps, id='point') > # split out the labels > labels <- do.call(rbind, strsplit(sub("(.*)(.)", "\\1 \\2", x$variable), ' ')) > x$source <- labels[, 2] > x$variable <- labels[, 1] > cast(x, point + source ~ variable)point source lat long 1 1 A 41.68 82.85 2 1 B 41.62 87.67 3 1 C -41.12 -83.03 4 1 D -41.03 -85.10 5 1 E 41.28 82.42 6 1 F 43.13 82.25 7 1 G 42.05 82.88 8 1 H 42.15 81.63 9 1 I 42.03 83.53 On Tue, Nov 3, 2009 at 5:26 PM, Michael Friendly <friendly at yorku.ca> wrote:> Given a data frame consisting of a pointID and 12 pairs of (lat, long) > variables, with names > latA, longA, latB, longB, ... latL, longL, I want to reshape it into a data > frame with the structure > > point ?source ?lat long > ?1 ? ? ? ?A ? ? ? ... ? ... > ?1 ? ? ? ?B ? ? ?... ? ?... > > I've looked at reshape and plyr, but can't figure out how to do this. > ?Details of my data frame are below > >> dput(head(maps)) > structure(list(point = 1:6, latA = c(41.68, 41.9, 42.25, 42.55, > 44.05, 43.65), longA = c(82.85, 82.52, 81.92, 80.03, 83.03, 83.95 > ), latB = c(41.62, 42.12, 42.07, 42.47, 43.42, 43.12), longB = c(87.67, > 87, 85.97, 84.17, 87.25, 87.92), latC = c(-41.12, 41.88, 42.13, > 42.13, 44.23, 43.25), longC = c(-83.03, 82, 80.78, 79.55, 83.6, > 84.48), latD = c(-41.03, 41.87, 41.98, 42, 44.13, 43.8), longD = c(-85.1, > 85.37, 83.78, 83.18, 86.85, 87.1), latE = c(41.28, 42.08, 42.22, > 42.07, 44.6, 43.72), longE = c(82.42, 81.17, 80.2, 80.27, 83.5, > 83.23), latF = c(43.13, 42.35, 42.62, 42.83, 44.62, 43.62), longF = c(82.25, > 81.77, 81.37, 79.92, 85.5, 85.25), latG = c(42.05, 42.23, 42.37, > 42.37, 44.75, 44.03), longG = c(82.88, 82.35, 81.3, 80.03, 83.57, > 83.47), latH = c(42.15, 42.38, 42.53, 42.87, 44.47, 44.03), longH = c(81.63, > 80.78, 80.35, 78.73, 81.75, 81.72), latI = c(42.03, 42.25, 42.33, > 42.33, 44.75, 44.03), longI = c(83.53, 82.45, 81.98, 80.65, 84.33, > 84.22), latJ = c(42.02, 42.12, 42.5, 42.68, 44.35, 44.07), longJ = c(82.9, > 82.42, 81.87, 80.15, 82.9, 83.6), latK = c(42, 42.08, 42.48, > 42.67, 44.32, 44.03), longK = c(82.9, 82.37, 81.87, 80.18, 82.9, > 83.57), latL = c(-41.12, 42, 42.32, 42.55, 44.27, -44.07), longL = c(-82.12, > 82.08, 81.75, 80.08, 83, -83.12)), .Names = c("point", "latA", > "longA", "latB", "longB", "latC", "longC", "latD", "longD", "latE", > "longE", "latF", "longF", "latG", "longG", "latH", "longH", "latI", > "longI", "latJ", "longJ", "latK", "longK", "latL", "longL"), row.names > c(NA, > 6L), class = "data.frame") > > -- > Michael Friendly ? ? Email: friendly AT yorku DOT ca Professor, Psychology > Dept. > York University ? ? ?Voice: 416 736-5115 x66249 Fax: 416 736-5814 > 4700 Keele Street ? ?http://www.math.yorku.ca/SCS/friendly.html > Toronto, ONT ?M3J 1P3 CANADA > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem that you are trying to solve?
Possibly Parallel Threads
- Batch mode problem: figure margins too large (code corrected for word wrap)
- groupedData Error Using outer=TRUE
- Batch mode problem: figure margins too large
- RE: Batch mode problem: figure margins too large (aligned R code to the left)
- R crashes trying to read a data.frame