2016-04-08 18 views
1

Um einen Teil eines Datensatzes zu säubern, muss ich eine Spalte in mehrere trennen. Diese Daten nimmt die Form ähnlich wie diese:Unordentliche Daten in R - ODK Aufräumen trennen

set.seed(2133) 
df <- data.frame(a = paste(sample(1:9, 5, replace=T), sample(c("", "%2", "%3"), 5, replace=T), sample(c("", "%3", "%4"), 5, replace=T), sep="")) 
df 
     a 
1  6 
2 2%3%4 
3 6%2 
4 3%2 
5 5%2%4 

Tidyr die separate Funktion tun wird nicht den Job und die beste Idee, die ich habe, ist eine Reihe von ifelse Aussagen, wie folgt aus:

df$One <- ifelse(grepl("1", df$a) == T, 1, 0) 
df$Two <- ifelse(grepl("2", df$a) == T, 1, 0) 
      a One Two 
1  6 0 0 
2 2%3%4 0 1 
3 6%2 0 1 
4 3%2 0 1 
5 5%2%4 0 1 

Was ist der beste Weg, über solche Aufräumarbeiten zu gehen. Ich bin mir sicher, dass viele Leute, die mit Open Data Kit (ODK) für die Datenerfassung arbeiten, darauf stoßen werden.

Antwort

2

Wir können Schleife die Muster (dh 1, 2) mit sapply, eine logische Matrix erhalten, zwingen zu binären mit + durch Umwickeln und ordnen sie als neue Spalten in 'df'

df[c("One", "Two")] <- +(sapply(1:2, grepl, df$a)) 
df 
#  a One Two 
#1  6 0 0 
#2 2%3%4 0 1 
#3 6%2 0 1 
#4 3%2 0 1 
#5 5%2%4 0 1 

Wenn dies die binäre Ausgabe für jeden eindeutigen Wert in 'a' Spalte erhalten soll, können wir die Zeichenketten in 'a' durch das Trennzeichen (%) teilen, die Ausgabe list kann in data.frame umgewandelt werden mit stack, transform die 'Werte' Spalte zu factor Klasse durch Angabe der levels und tun das table

table(transform(stack(setNames(strsplit(as.character(df$a), "[%]"), 
     1:nrow(df))), values = factor(values, levels= 1:6))[2:1]) 

Oder wir eine komfortable Funktion mtabulate von qdapTools nach dem Spalten verwenden können.

library(qdapTools) 
mtabulate(strsplit(as.character(df$a), "[%]")) 
+1

Ich mag Basisversion. Schöne Optionen. – Simon