Rmd

Beispiel SummarySE

Flexible und sparsame deskriptive Daten sind häufig die Basis für Tabellen oder Grafiken, aber auch notwendig für das Verständnis der Daten. Einige Pakete liefern hierfür gute Kommandos, beispielsweise der Befehl describe() und describe_by() aus library(psych). Die library(Rmisc) stellt den Befehl summarySE() zur Verfügung. Diese Ansätze sind sehr nützlich, aber bieten nur das, was die Autoren eingebaut haben, beispielsweise über Optionen.

df <- read.delim("http://134.76.136.204/data/div/df_dplyr.txt")
# summarySE can do some nice descriptives, also grouped, but only for one variable at a time
require(Rmisc)
## Loading required package: Rmisc
## Loading required package: lattice
## Loading required package: plyr
summarySE(df, "v1")
##    .id  N       v1       sd       se      ci
## 1 <NA> 12 52.08333 24.45946 7.060838 15.5408
summarySE(df, "v1", "gender")
##   gender N       v1       sd       se       ci
## 1      f 6 48.66667 28.73094 11.72936 30.15127
## 2      m 6 55.50000 21.51046  8.78161 22.57385
summarySE(df, "v1", c("gender", "grp"))
##   gender grp N   v1        sd   se        ci
## 1      f   1 2 36.5 38.890873 27.5 349.42063
## 2      f   2 2 53.5 19.091883 13.5 171.53376
## 3      f   3 2 56.0 42.426407 30.0 381.18614
## 4      m   1 2 51.0 18.384776 13.0 165.18066
## 5      m   2 2 41.5 27.577164 19.5 247.77099
## 6      m   3 2 74.0  9.899495  7.0  88.94343
# we deactivate package Rmisc to keep environment clean
detach("package:Rmisc", unload=TRUE)

# get something comparable using dplyr - but more flexible due to the modular concept
require(dplyr)
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## 
## Die folgenden Objekte sind maskiert von 'package:plyr':
## 
##     arrange, count, desc, failwith, id, mutate, rename, summarise,
##     summarize
## 
## Die folgenden Objekte sind maskiert von 'package:stats':
## 
##     filter, lag
## 
## Die folgenden Objekte sind maskiert von 'package:base':
## 
##     intersect, setdiff, setequal, union
# let's get means and se to be a base for graphs
# se is not a standard command - so we define it
se <- function(x){ return (sd(x)/sqrt(length(x))) }
# get mean for variable v1
dplyr::select(df, v1) %>% dplyr::summarize(mean(v1))
##   mean(v1)
## 1 52.08333
# we might want se also
dplyr::select(df, v1) %>% dplyr::summarize(mean(v1), se(v1))
##   mean(v1)   se(v1)
## 1 52.08333 7.060838
# we might have grouped descriptives
# we begin with gender specific mean and se
dplyr::group_by(df, gender) %>% dplyr::summarize(mean(v1), se(v1))
## Source: local data frame [2 x 3]
## 
##   gender mean(v1)   se(v1)
##   (fctr)    (dbl)    (dbl)
## 1      f 48.66667 11.72936
## 2      m 55.50000  8.78161
# we might be interested in a split by gender and grp
dplyr::group_by(df, gender, grp) %>% dplyr::summarize(mean(v1), se(v1))
## Source: local data frame [6 x 4]
## Groups: gender [?]
## 
##   gender   grp mean(v1) se(v1)
##   (fctr) (int)    (dbl)  (dbl)
## 1      f     1     36.5   27.5
## 2      f     2     53.5   13.5
## 3      f     3     56.0   30.0
## 4      m     1     51.0   13.0
## 5      m     2     41.5   19.5
## 6      m     3     74.0    7.0
# we might want to have the same for several variables at a time
dplyr::group_by(df, gender, grp)  %>% dplyr::select(v1:v3) %>% dplyr::summarize_each(funs(mean, se))
## Source: local data frame [6 x 8]
## Groups: gender [?]
## 
##   gender   grp v1_mean v2_mean v3_mean v1_se v2_se v3_se
##   (fctr) (int)   (dbl)   (dbl)   (dbl) (dbl) (dbl) (dbl)
## 1      f     1    36.5    42.0    37.5  27.5  26.0  29.5
## 2      f     2    53.5    59.5    55.0  13.5  13.5  11.0
## 3      f     3    56.0    60.5    59.5  30.0  26.5  31.5
## 4      m     1    51.0    51.0    49.5  13.0  15.0  14.5
## 5      m     2    41.5    45.5    42.5  19.5  20.5  21.5
## 6      m     3    74.0    76.5    74.0   7.0   9.5   7.0

Beispiel mit mehreren eigenen Funktionen und missing data Behandlung

df <- read.delim("http://134.76.136.204/data/div/df_dplyr.txt")

# define various aggregation functions
# mean, build of values from 1 or higher 
m_mean <- function(x){return(mean(x[x>0], na.rm=TRUE))}
# n of values that led to m_mean above
n_valids <- function(x){return(length(x[x > 0 & !is.na(x)]))}
# define valids that returns number of non missing values
n_total <- function(x){return(sum(!is.na(x)))}
# define valids that returns number of non missing values
n_zero  <- function(x){return(length(x[!is.na(x) & x == 0]))}

# todo

Umgang mit zwei Dataframes: merging

Ausweiten eines Dataframe: Hinzufügen von Beobachtungen, hinzufügen von Spalten(Variablen), Kombination aus beiden

Behandlung mit dplyr two table verbs

Entsprechende Seite in Quick-R

Zwei Datenframes mit derselben Struktur (denselben Spaltennamen) können mit dem Befehl rbind() aneinandergehängt werden. Dies entspricht in etwa dem merge Befehl in anderen Paketen. rbind() bezieht sich auf Zeilen, wie sich cbind() auf Spalten bezieht. Mit rbind() werden Zeilen angehängt. Dies entspricht dem Hinzufügen von Beobachtungen (Personen).

verschiedene bzw. fehlende Spalten/Variablen

rbind verknüpft nur Dataframes mit den gleichen Spalten (gleiche Spaltennamen).

Entweder, die Variable(n), die es in einem Teil-Dataframe nicht gibt, werden dort gelöscht, wo sie existieren, oder die fehlenden Variablen werden dort, wo sie fehlen, generiert und sinnvollerweise mit NA vorbesetzt. Dies muss vor dem rbind() Befehl passieren.

Mini-Beispiel hinzufügen von Beobachtungen (Zeilen)

Ausgangs-Datensatz ist der unter bisherige df

   subj gender age grp v1 v2 v3
1     1      f  17   1  9 16  8
2     2      f  33   2 67 73 66
3     3      f  47   3 86 87 91
4     4      f  10   1 64 68 67
5     5      f  21   2 40 46 44
6     6      f  30   3 26 34 28
7     7      m  51   1 64 66 64
8     8      m  13   2 61 66 64
9     9      m  17   3 67 67 67
10   10      m  25   1 38 36 35
11   11      m  33   2 22 25 21
12   12      m  27   3 81 86 81

Angenommen, es soll ein neuer Datensatz hinzugefügt werden, der strukturell ähnlich, aber nicht gleich ist.

df <- read.delim("http://134.76.136.204/data/div/df_dplyr.txt")
require(dplyr)

# we have additional subjects and additional variables
# we also have conflicting values for some subjects
df.2 <- data_frame(
    subj   = as.integer(c( 2,3,5,20,21,22)),
    gender = as.factor(c('f', 'm','f','f','f','f')),
    age    = as.integer(c(33, NA, NA, 22, 22, 22)),
    grp    = as.integer(c(2, 3, 2, 1, 2, 3)),
    v3     = as.integer(c(67, 1, 1, 50, 50, 50)),
    v4     = as.integer(c(51, 52, 53, 54, 55, 56)),
    v5     = as.integer(c(61, 62, 63, 64, 65, 66))
    )

df %>% dplyr::inner_join(df.2)
## Joining by: c("subj", "gender", "age", "grp", "v3")
## [1] subj   gender age    grp    v1     v2     v3     v4     v5    
## <0 rows> (or 0-length row.names)
df %>% dplyr::left_join(df.2)
## Joining by: c("subj", "gender", "age", "grp", "v3")
##    subj gender age grp v1 v2 v3 v4 v5
## 1     1      f  17   1  9 16  8 NA NA
## 2     2      f  33   2 67 73 66 NA NA
## 3     3      f  47   3 86 87 91 NA NA
## 4     4      f  10   1 64 68 67 NA NA
## 5     5      f  21   2 40 46 44 NA NA
## 6     6      f  30   3 26 34 28 NA NA
## 7     7      m  51   1 64 66 64 NA NA
## 8     8      m  13   2 61 66 64 NA NA
## 9     9      m  17   3 67 67 67 NA NA
## 10   10      m  25   1 38 36 35 NA NA
## 11   11      m  33   2 22 25 21 NA NA
## 12   12      m  27   3 81 86 81 NA NA
df %>% dplyr::right_join(df.2)
## Joining by: c("subj", "gender", "age", "grp", "v3")
##   subj gender age grp v1 v2 v3 v4 v5
## 1    2      f  33   2 NA NA 67 51 61
## 2    3      m  NA   3 NA NA  1 52 62
## 3    5      f  NA   2 NA NA  1 53 63
## 4   20      f  22   1 NA NA 50 54 64
## 5   21      f  22   2 NA NA 50 55 65
## 6   22      f  22   3 NA NA 50 56 66
df %>% dplyr::full_join(df.2)
## Joining by: c("subj", "gender", "age", "grp", "v3")
##    subj gender age grp v1 v2 v3 v4 v5
## 1     1      f  17   1  9 16  8 NA NA
## 2     2      f  33   2 67 73 66 NA NA
## 3     3      f  47   3 86 87 91 NA NA
## 4     4      f  10   1 64 68 67 NA NA
## 5     5      f  21   2 40 46 44 NA NA
## 6     6      f  30   3 26 34 28 NA NA
## 7     7      m  51   1 64 66 64 NA NA
## 8     8      m  13   2 61 66 64 NA NA
## 9     9      m  17   3 67 67 67 NA NA
## 10   10      m  25   1 38 36 35 NA NA
## 11   11      m  33   2 22 25 21 NA NA
## 12   12      m  27   3 81 86 81 NA NA
## 13    2      f  33   2 NA NA 67 51 61
## 14    3      m  NA   3 NA NA  1 52 62
## 15    5      f  NA   2 NA NA  1 53 63
## 16   20      f  22   1 NA NA 50 54 64
## 17   21      f  22   2 NA NA 50 55 65
## 18   22      f  22   3 NA NA 50 56 66
# union(df, df.2) 
# would cause error "not compatible: Cols in y but not x: v4, v5. Cols in x but not y: v2, v1"

# make dataframes have the same columns
df.1 <- df
df.1$v4 <- as.integer(NA)
df.1$v5 <- as.integer(NA)
df.2$v1 <- as.integer(NA)
df.2$v2 <- as.integer(NA)
df.m <- union(df.1, df.2)
# only one subject remains
df.m[order("subj"),]
##   subj gender age grp v1 v2 v3 v4 v5
## 1   22      f  22   3 NA NA 50 56 66

mtcars and conversion

U.S. Gallon = 3.785411784 Liters

Mile = 1.609344 Kilometers

\[ l_{100km} = \frac{100 * 3.785411784} {1.609344 * MpG} \]

ddf <- mtcars
names(mtcars)
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
ddf$l_100km <- (100 * 3.785411784) / (1.609344 * ddf$mpg)
require(dplyr)
dplyr::mutate(ddf, l100km = (100 * 3.785411784) / (1.609344 * mpg))
##     mpg cyl  disp  hp drat    wt  qsec vs am gear carb   l_100km    l100km
## 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 11.200694 11.200694
## 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 11.200694 11.200694
## 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1 10.316429 10.316429
## 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 10.991336 10.991336
## 5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2 12.578320 12.578320
## 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 12.995281 12.995281
## 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 16.448572 16.448572
## 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2  9.639942  9.639942
## 9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2 10.316429 10.316429
## 10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4 12.250760 12.250760
## 11 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4 13.214302 13.214302
## 12 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3 14.342353 14.342353
## 13 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3 13.596219 13.596219
## 14 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3 15.474644 15.474644
## 15 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4 22.616787 22.616787
## 16 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4 22.616787 22.616787
## 17 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4 16.000992 16.000992
## 18 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1  7.259709  7.259709
## 19 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2  7.737322  7.737322
## 20 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1  6.938483  6.938483
## 21 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1 10.940213 10.940213
## 22 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2 15.175134 15.175134
## 23 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2 15.474644 15.474644
## 24 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4 17.685307 17.685307
## 25 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2 12.250760 12.250760
## 26 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1  8.615919  8.615919
## 27 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2  9.046715  9.046715
## 28 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2  7.737322  7.737322
## 29 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4 14.886999 14.886999
## 30 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6 11.939827 11.939827
## 31 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8 15.680972 15.680972
## 32 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2 10.991336 10.991336

… more to come

References

Befehlsreferenz mit Beispielen

Data wrangling cheatsheet

Vignetten

http://rpubs.com/justmarkham/dplyr-tutorial

http://www.r-bloggers.com/hands-on-dplyr-tutorial-for-faster-data-manipulation-in-r/

two table verbs

Hadley Wickhams Artikel zu tidy data, auch lokal.