2016-06-20 20 views
1

おそらくこれはちょっとしたことですが、データフレーム内の文字列の複数の列を分割する洗練された方法を考えてみたいと思います。例えば、私は、多くの場合、このような単位は値と同じ細胞であるExcelからデータを受け取る:データフレーム内の複数の文字ベクトルを効率的に分割する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 

ここから、ユニットを分離して格納する必要があります。通常、私は次のようなことをします:

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 

これは機能しますが、実装するのは面倒です。このタイプの問題に対して、より良い解決策がありますか?

答えて

1

我々はpaste一緒にそれと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 

で読み取る別のオプションは、cSplit

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

NOTEであることができます:set.seedはOPで呼び出されなかったような値が異なっています。

+1

これははるかに速く、より複雑ではありません。ありがとう! – hubbs5

関連する問題