15.19. Converting Data from Wide to Long
Problem
You want to convert a data frame from “wide” format to “long” format.
Solution
Use melt() from the reshape2 package. In the anthoming data set, for each angle, there
are two measurements: one column contains measurements in the experimental con‐
dition and the other contains measurements in the control condition:
library(gcookbook) # For the data set
anthoming
angle expt ctrl
-20    1    0
-10    7    3
   2    3
10    0    3
20    0    1
We can reshape the data so that all the measurements are in one column. This will put
the values from expt and ctrl into one column, and put the names into a different
column:
library(reshape2)
melt(anthoming, id.vars="angle", variable.name="condition", value.name="count")
angle condition count
-20      expt     1
-10      expt     7
     expt     2
10      expt     0
20      expt     0
-20      ctrl     0
-10      ctrl     3
     ctrl     3
10      ctrl     3
20      ctrl     1
This data frame represents the same information as the original one, but it is structured
in a way that is more conducive to some analyses.
15.19. Converting Data from Wide to Long  |  365
Pdf search and replace text - search text inside PDF file in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn how to search text in PDF document and obtain text content and location information
select text in pdf reader; how to select text in pdf and copy
Pdf search and replace text - VB.NET PDF Text Search Library: search text inside PDF file in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn How to Search Text in PDF Document and Obtain Text Content and Location Information in VB.NET application
search multiple pdf files for text; find text in pdf files
Discussion
In the source data, there are ID variables and measure variables. The ID variables are
those that specify which values go together. In the source data, the first row holds meas‐
urements for when angle is –20. In the output data frame, the two measurements, for
expt and ctrl, are no longer in the same row, but we can still tell that they belong
together because they have the same value of angle.
The measure variables are by default all the non-ID variables. The names of these vari‐
ables are put into a new column specified by variable.name, and the values are put into
a new column specified by value.name.
If you don’t want to use all the non-ID columns as measure variables, you can specify
measure.vars. For example, in the drunk data set, we can use just the 0-29 and 30-39
groups:
drunk
sex 0-29 30-39 40-49 50-59 60+
male  185   207   260   180  71
female    4    13    10     7  10
melt(drunk, id.vars="sex", measure.vars=c("0-29""30-39"),
variable.name="age", value.name="count")
sex   age count
male  0-29   185
female  0-29     4
male 30-39   207
female 30-39    13
It’s also possible to use more than one column as the ID variables:
plum_wide
length      time dead alive
long   at_once   84   156
long in_spring  156    84
short   at_once  133   107
short in_spring  209    31
melt(plum_wide, id.vars=c("length","time"), variable.name="survival"
value.name="count")
length      time survival count
long   at_once     dead    84
long in_spring     dead   156
short   at_once     dead   133
short in_spring     dead   209
366  |  Chapter 15: Getting Your Data into Shape
C# PDF replace text Library: replace text in PDF content in C#.net
public void Replace(String oldString, String newString, RESearchOption option specified string text that match the search option from specified PDF page.
find and replace text in pdf file; how to select all text in pdf
VB.NET PDF replace text library: replace text in PDF content in vb
NET: Replace Text in PDF File. The following coding example illustrates how to perform PDF text replacing function in your VB.NET project, according to search
how to select text in pdf; make pdf text searchable
long   at_once    alive   156
long in_spring    alive    84
short   at_once    alive   107
short in_spring    alive    31
Some data sets don’t come with a column with an ID variable. For example, in the
corneas data set, each row represents one pair of measurements, but there is no ID
variable. Without an ID variable, you won’t be able to tell how the values are meant to
be paired together. In these cases, you can add an ID variable before using melt():
# Make a copy of the data
co <- corneas
co
affected notaffected
488         484
478         478
480         492
426         444
440         436
410         398
458         464
460         476
# Add an ID column
co$id <- 1:nrow(co)
melt(co, id.vars="id", variable.name="eye", value.name="thickness")
id         eye thickness
   affected       488
   affected       478
   affected       480
   affected       426
   affected       440
   affected       410
   affected       458
   affected       460
1 notaffected       484
2 notaffected       478
3 notaffected       492
4 notaffected       444
5 notaffected       436
6 notaffected       398
7 notaffected       464
8 notaffected       476
Having numeric values for the ID variable may be problematic for subsequent analyses,
so you may want to convert id to a character vector with as.character(), or a factor
with factor().
15.19. Converting Data from Wide to Long  |  367
C# PDF delete text Library: delete, remove text from PDF file in
option). Description: Delete specified string text that match the search option from PDF file. Parameters: Name, Description, Valid Value.
convert pdf to word searchable text; search text in multiple pdf
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
Text from PDF. Text: Search Text in PDF. Image: Extract Image from PDF. PDF Write. Text: Insert Text to PDF. Text: Delete Text from PDF. Text: Replace Text in PDF
searching pdf files for text; how to search text in pdf document
See Also
See Recipe 15.20 to do conversions in the other direction, from long to wide.
See the stack() function for another way of converting from wide to long.
15.20. Converting Data from Long to Wide
Problem
You want to convert a data frame from “long” format to “wide” format.
Solution
Use the dcast() function from the reshape2 package. In this example, we’ll use the
plum data set, which is in a long format:
library(gcookbook) # For the data set
plum
length      time survival count
long   at_once     dead    84
long in_spring     dead   156
short   at_once     dead   133
short in_spring     dead   209
long   at_once    alive   156
long in_spring    alive    84
short   at_once    alive   107
short in_spring    alive    31
The conversion to wide format takes each unique value in one column and uses those
values as headers for new columns, then uses another column for source values. For
example, we can “move” values in the survival column to the top and fill them with
values from count:
library(reshape2)
dcast(plum, length + time ~ survival, value.var="count")
length      time dead alive
long   at_once   84   156
long in_spring  156    84
short   at_once  133   107
short in_spring  209    31
368  |  Chapter 15: Getting Your Data into Shape
VB.NET PDF Page Replace Library: replace PDF pages in C#.net, ASP.
Text from PDF. Text: Search Text in PDF. Image: Extract Image from PDF. PDF Write. Text: Insert Text to PDF. Text: Delete Text from PDF. Text: Replace Text in PDF
pdf text search; cannot select text in pdf file
C# PDF Page Replace Library: replace PDF pages in C#.net, ASP.NET
You can replace an entire PDF page with another PDF page from another PDF file. All information, data on the original page are removed, including text, images
convert pdf to searchable text online; how to make a pdf document text searchable
Discussion
The dcast() function requires you to specify the ID variables (those that remain in
columns) and the variable variables (those that get “moved to the top”). This is done
with a formula where the ID variables are before the tilde (~) and the variable variables
are after it.
In the preceding example, there are two ID variables and one variable variable. In the
next one, there is one ID variable and two variable variables. When there is more than
one variable variable, the values are combined with an underscore:
dcast(plum, time ~ length + survival, value.var="count")
time long_dead long_alive short_dead short_alive
at_once        84        156        133         107
in_spring       156         84        209          31
See Also
See Recipe 15.19 to do conversions in the other direction, from wide to long.
See the unstack() function for another way of converting from long to wide.
15.21. Converting a Time Series Object to Times
and Values
Problem
You have a time series object that you wish to convert to numeric vectors representing
the time and values at each time.
Solution
Use the time() function to get the time for each observation, then convert the times
and values to numeric vectors with as.numeric():
# Look at nhtemp Time Series object
nhtemp
Time Series:
Start = 1912
End = 1971
Frequency = 1
[1] 49.9 52.3 49.4 51.1 49.4 47.9 49.8 50.9 49.3 51.9 50.8 49.6 49.3 50.6 48.4
[16] 50.7 50.9 50.6 51.5 52.8 51.8 51.1 49.8 50.2 50.4 51.6 51.8 50.9 48.8 51.7
[31] 51.0 50.6 51.7 51.5 52.1 51.3 51.0 54.0 51.4 52.7 53.1 54.6 52.0 52.0 50.9
[46] 52.6 50.2 52.6 51.6 51.9 50.5 50.9 51.7 51.4 51.7 50.8 51.9 51.8 51.9 53.0
15.21. Converting a Time Series Object to Times and Values  |  369
C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
Text from PDF. Text: Search Text in PDF. Image: Extract Image from PDF. PDF Write. Text: Insert Text to PDF. Text: Delete Text from PDF. Text: Replace Text in PDF
pdf make text searchable; cannot select text in pdf
C# PDF Text Highlight Library: add, delete, update PDF text
Description: Highlight specified string text that match the search option from PDF file. Parameters: Name, Description, Valid Value.
converting pdf to searchable text format; pdf search and replace text
# Get times for each observation
as.numeric(time(nhtemp))
[1] 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926
[16] 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941
[31] 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956
[46] 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971
# Get value of each observation
as.numeric(nhtemp)
[1] 49.9 52.3 49.4 51.1 49.4 47.9 49.8 50.9 49.3 51.9 50.8 49.6 49.3 50.6 48.4
[16] 50.7 50.9 50.6 51.5 52.8 51.8 51.1 49.8 50.2 50.4 51.6 51.8 50.9 48.8 51.7
[31] 51.0 50.6 51.7 51.5 52.1 51.3 51.0 54.0 51.4 52.7 53.1 54.6 52.0 52.0 50.9
[46] 52.6 50.2 52.6 51.6 51.9 50.5 50.9 51.7 51.4 51.7 50.8 51.9 51.8 51.9 53.0
# Put them in a data frame
nht <- data.frame(year=as.numeric(time(nhtemp)), temp=as.numeric(nhtemp))
nht
year temp
1912 49.9
1913 52.3
...
1970 51.9
1971 53.0
Discussion
Time series objects efficiently store information when there are observations at regular
time intervals, but for use with ggplot2, they need to be converted to a format that
separately represents times and values for each observation.
Some time series objects are cyclical. The presidents data set, for example, contains
four observations per year, one for each quarter:
presidents
Qtr1 Qtr2 Qtr3 Qtr4
1945   NA   87   82   75
1946   63   50   43   32
1947   35   60   54   55
...
1972   49   61   NA   NA
1973   68   44   40   27
1974   28   25   24   24
To convert it to a two-column data frame with one column representing the year with
fractional values, we can do the same as before:
pres_rating <- data.frame(
year    = as.numeric(time(presidents)),
370  |  Chapter 15: Getting Your Data into Shape
rating  = as.numeric(presidents)
)
pres_rating
year rating
1945.00     NA
1945.25     87
1945.50     82
...
1974.25     25
1974.50     24
1974.75     24
It is also possible to store the year and quarter in separate columns, which may be useful
in some visualizations:
pres_rating2 <- data.frame(
year    = as.numeric(floor(time(presidents))),
quarter = as.numeric(cycle(presidents)),
rating  = as.numeric(presidents)
)
pres_rating2
year quarter rating
1945       1     NA
1945       2     87
1945       3     82
...
1974       2     25
1974       3     24
1974       4     24
See Also
The zoo package is also useful for working with time series objects.
15.21. Converting a Time Series Object to Times and Values  |  371
APPENDIX A
Introduction to ggplot2
Most of the recipes in this book involve the ggplot2 package, written by Hadley Wick‐
ham. ggplot2 has only been around for a few years, but in that short time it has attracted
many users in the R community because of its versatility, clear and consistent interface,
and beautiful output.
ggplot2 takes a different approach to graphics than other graphing packages in R. It gets
its name from Leland Wilkinson’s grammar of graphics, which provides a formal, struc‐
tured perspective on how to describe data graphics.
Even though this book deals largely with ggplot2, I don’t mean to say that it’s the be-all
and end-all of graphics in R. For example, I sometimes find it faster and easier to inspect
and explore data with R’s base graphics, especially when the data isn’t already structured
properly for use with ggplot2. There are some things that ggplot2 can’t do, or can’t do
as well as other graphing packages. There are other things that ggplot2 can do, but that
specialized packages are better suited to handling. For most purposes, though, I believe
that ggplot2 gives the best return on time invested, and it provides beautiful, publication-
ready results.
Another excellent package for general-purpose graphs is lattice, by Deepyan Sarkar,
which is an implementation of trellis graphics. It is included as part of the base instal‐
lation of R.
If you want a deeper understanding of ggplot2, read on!
Background
In a data graphic, there is a mapping (or correspondence) from properties of the data
to visual properties in the graphic. The data properties are typically numerical or cate‐
gorical values, while the visual properties include the x and y positions of points, colors
of lines, heights of bars, and so on. A data visualization that didn’t map the data to visual
373
properties wouldn’t be a data visualization. On the surface, representing a number with
an x coordinate may seem very different from representing a number with a color of a
point, but at an abstract level, they are the same. Everyone who has made data graphics
has at least an implicit understanding of this. For most of us, that’s where our under‐
standing remains.
In the grammar of graphics, this deep similarity is not just recognized, but made central.
In R’s base graphics functions, each mapping of data properties to visual properties is
its own special case, and changing the mappings may require restructuring your data,
issuing completely different graphing commands, or both.
To illustrate, I’ll show a graph made from the simpledat data set from the gcookbook
package:
library(gcookbook) # For the data set
simpledat
A1 A2 A3
B1 10  7 12
B2  9 11  6
This will make a simple grouped bar graph, with the As going along the x-axis and the
bars grouped by the Bs (Figure A-1):
barplot(simpledat, beside=TRUE)
Figure A-1. A bar graph made with barplot()
One thing we might want to do is switch things up so the Bs go along the x-axis and the
As are used for grouping. To do this, we need to restructure the data by transposing the
matrix:
374  |  Appendix A: Introduction to ggplot2
Documents you may be interested
Documents you may be interested