readxl – a new r package to import data from excel

There are many ways to import data from excel spreadsheets into R (see ‘R Tutorial on Reading and Importing Excel Files into R’).

With Hadley Wickham’s recent r-package readxl, it is possible to import large excel files very quickly.

library(readxl)
# example 1
mydata <- read_excel("excelfile.xls", sheet = "sheet1")

# example 2
mydata <- read_excel("C:/myfiles/excelfile.xlsx", sheet = 1)

# example 3
mydata <- read_excel("excelfile.xlsx", sheet = 1, na = "99")

Example 1 loads the sheet sheet1 from excel file named excelfile.xls
The code examples are quite straightforward and easy to understand. The sheet we wish to import maybe specified either as string (the name of a sheet, see example 1) or as integer (the position of the sheet, see example 2).

In case the excel file we wish to import is not located in the current working directory, we need to specify the path to the excel file (see example 2).

Moreover, it is possible to specify a missing value (only one). In example 3, the value 99 will be treated as missing value.

Since the readxl package has been published only very recently, it is rather likely that the author will add some more features in the future.

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)))
}