How to: Aufteilen eines Dataframe nach Variablentyp

R zeichnet sich u.a. dadurch aus, dass es mit vielen verschiedenen Datenformaten bzw. -typen ‘zurecht kommt’. So lassen sich Werte u.a. in Vektoren, Matritzen und Listen speichern. Das wohl am meisten verwendete Datenformat ist jedoch der dataframe. Enthält ein solcher dataframe eine sehr große Anzahl von Variablen, kann es sinnvoll sein, diesen anhand des Variablentyps aufzuteilen. Dabei ist die Unterscheidung zwischen numerischen Variablen, kategorialen Variablen und Stringvariablen sinnvoll.

Das folgende Beispiel zeigt, wie man aus einem dataframe drei neue dataframes erstellt, die jeweils nur String, kategoriale bzw. numerische Variablen enthalten.

Zunächst erzeugen wir einen dataframe, der insgesamt 100 Fälle und sechs Variablen enthält, wobei die Namen der Variablen für den Variablentyp stehen.

mydataframe <- data.frame(string.1 = rep(c("text1", "text2"), 50), string.2 = rep(c("text3", 
    "text4"), 50), categorial.1 = as.factor(rep(c("male", "female"), 50)), categorial.2 = as.factor(rep(c("young", 
    "old"), 50)), numeric.1 = rnorm(100, 200, 30), numeric.2 = rnorm(100, 60, 
    5))
mydataframe$string.1 <- as.character(mydataframe$string.1)
mydataframe$string.2 <- as.character(mydataframe$string.2)

Danach lassen wir uns Informationen zu den einzelnen Variablen anzeigen.

str(mydataframe)
## 'data.frame':    100 obs. of  6 variables:
##  $ string.1    : chr  "text1" "text2" "text1" "text2" ...
##  $ string.2    : chr  "text3" "text4" "text3" "text4" ...
##  $ categorial.1: Factor w/ 2 levels "female","male": 2 1 2 1 2 1 2 1 2 1 ...
##  $ categorial.2: Factor w/ 2 levels "old","young": 2 1 2 1 2 1 2 1 2 1 ...
##  $ numeric.1   : num  241 253 202 135 157 ...
##  $ numeric.2   : num  64.3 62.7 58.7 63.1 59.2 ...

Die Bezeichnungen chr, Factor und num weißen darauf hin, dass es sich bei unseren Variablen tatsächlich um jeweils zwei String-, kategoriale sowie numerische Variablen handelt.

Stringvariablen

Die folgende Anweisung schreibt alle Stringvariablen des dataframes ‘mydataframe’ in einen neuen dataframe namens ‘df.string’. Dabei werden die Variablennamen des dataframe ‘mydataframe’ zunächst in einem Vector names ‘vars’ gespreichert. In einem zweiten Schritt wird überprüft, bei welchen Variablen es sich um Stringvariablen handelt. Die Namen dieser Variablen werden in dem Vector ‘string.vars’ gespreichert. Schlussendlich wird ein neuer dataframe (‘df.strings’) erstellt, der alle Stringvariablen des dataframe ‘mydataframe’ enthält.

vars <- colnames(mydataframe)
string.vars <- vars[sapply(mydataframe[, vars], class) %in% "character"]
df.string <- data.frame(mydataframe[, string.vars])

Mit dem folgenden Befehl lässt sich anzeigen, welchen Variablentyp die Variablen des dataframe ‘df.string’ haben. Es zeigt sich, dass es sich dabei tatsächlich nur um Stringvariablen handelt. Genauer gesagt: um alle Stringvariablen des dataframes ‘mydataframe’.

summary(df.string)
##    string.1           string.2        
##  Length:100         Length:100        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character

Will man die Namen der im neuen dataframe enthaltenen Variablen ändern, ist das mit dem folgenden Befehl möglich:

library(dplyr)
for (i in 1:length(string.vars)) {
    df.string <- rename_(df.string, .dots = setNames(colnames(df.string[i]), 
        paste0("var.", i)))
}

Die neuen Variablennamen setzten sich aus dem Wortstamm ‘var’ und einem Suffix zusammen, das die Position der Variable im dataframe widergibt:

names(df.string)
## [1] "var.1" "var.2"

Analog dazu lassen sich dataframes erstellen, die ausschließlich kategoriale bzw. numerische Variablen enthalten:

Kategoriale Variablen

# Erstellen des dataframe
categorial.vars <- vars[sapply(mydataframe[, vars], class) %in% "factor"]
df.categorial <- data.frame(mydataframe[, categorial.vars])

# Umbenennen der Variablen
library(dplyr)
for (i in 1:length(categorial.vars)) {
    df.categorial <- rename_(df.categorial, .dots = setNames(colnames(df.categorial[i]), 
        paste0("var.", i)))
}

Numerische Variablen

# Erstellen des dataframe
numeric.vars <- vars[sapply(mydataframe[, vars], class) %in% c("numeric", "integer")]
df.numeric <- data.frame(mydataframe[, numeric.vars])

# Umbenennen der Variablen
library(dplyr)
for (i in 1:length(numeric.vars)) {
    df.numeric <- rename_(df.numeric, .dots = setNames(colnames(df.numeric[i]), 
        paste0("var.", i)))
}
Advertisements

About norbert

I am post doc at the Department of Medical Psychology and Sociology, Leipzig University (GER), with degrees in sociology (MA) and public health (MPH).
This entry was posted in Data Management. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s