2016-06-20 24 views
1

Vielleicht ist das ein bisschen wählerisch, aber ich würde gerne eine elegante Möglichkeit finden, mehrere Spalten von Strings in einem Datenrahmen aufzuteilen. Zum Beispiel erhalte ich oft Daten aus Excel, wo die Einheiten in den gleichen Zellen wie die Werte sind, wie folgt aus:Effiziente Aufteilung mehrerer Zeichenvektoren in einem Datenrahmen in R

df <- data.frame(A = paste(round(runif(5) * 10), "KG", sep = " "), 
      B = paste(round(runif(5) * 10), "KG", sep = " "), 
      C = paste(round(runif(5) * 10), "KG", sep = " ")) 
df 
    A B  C 
1 1 KG 9 KG 7 KG 
2 8 KG 1 KG 10 KG 
3 7 KG 8 KG 6 KG 
4 5 KG 6 KG 9 KG 
5 3 KG 2 KG 9 KG 

Von hier aus sind die Einheiten müssen getrennt und gespeichert werden. Typischerweise ich etwas wie folgt aus:

df2 <- as.data.frame(apply(df, 2, 
    function(x) as.numeric(lapply(strsplit(as.character(x), 
    split = " ", fixed = TRUE), "[", 1)))) 

df3 <- as.data.frame(apply(df, 2, 
    function(x) as.character(lapply(strsplit(as.character(x), 
    split = " ", fixed = TRUE), "[", 2)))) 

df4 <- cbind(df2, df3) 
df4 
    A B C A B C 
1 1 9 7 KG KG KG 
2 8 1 10 KG KG KG 
3 7 8 6 KG KG KG 
4 5 6 9 KG KG KG 
5 3 2 9 KG KG KG 

Es funktioniert, aber ist ein Streit zu implementieren. Gibt es eine bessere Lösung für diese Art von Problem?

Antwort

1

Wir können es zusammen paste und mit read.table

read.table(text=do.call(paste, df), sep="", header=FALSE, stringsAsFactors=FALSE) 
# V1 V2 V3 V4 V5 V6 
#1 4 KG 0 KG 6 KG 
#2 2 KG 5 KG 4 KG 
#3 4 KG 10 KG 1 KG 
#4 9 KG 4 KG 7 KG 
#5 1 KG 9 KG 5 KG 

Eine weitere Option ist cSplit

library(splitstackshape) 
cSplit(df, names(df), " ") 

Hinweis lesen: Die Werte sind anders als set.seed nicht aufgerufen wurde von der OP.

+1

Das ist viel schneller und weniger kompliziert. Vielen Dank! – hubbs5