2013-02-07 19 views
7

私は巨大なデータセットを持っています。そこには、各サブジェクト(行)ごとにいくつかの値を含む1つの列があります。ここでは単純化されたサンプルデータフレームです:1つの列を複数の列に分割する

data <- data.frame(subject = c(1:8), sex = c(1, 2, 2, 1, 2, 1, 1, 2), 
       age = c(35, 29, 31, 46, 64, 57, 49, 58), 
       v1 = c("2", "0", "3,5", "2 1", "A,4", "B,1,C", "A and B,3", "5, 6 A or C")) 

> data 
    subject sex age   v1 
1  1 1 35   2 
2  2 2 29   0 
3  3 2 31   3,5 # separated by a comma 
4  4 1 46   2 1 # separated by a blank space 
5  5 2 64   A,4 
6  6 1 57  B,1,C 
7  7 1 49 A and B,3 
8  8 2 58 5, 6 A or C 

私は最初の4列目(v1)内の文字(ABA and B、...)を削除したい、その後、ちょうどこのように複数列に4番目の列を分割:それは元のデータセットにV1で3,5がかかるため、それは元のデータセットにV1で2がかかるため第1被験者がX2で1かかり

subject sex age x1 x2 x3 x4 x5 x6 
1  1 1 35 0 1 0 0 0 0   
2  2 2 29 0 0 0 0 0 0 
3  3 2 31 0 0 1 0 1 0 
4  4 1 46 1 1 0 0 0 0 
5  5 2 64 0 0 0 1 0 0 
6  6 1 57 1 0 0 0 0 0 
7  7 1 49 0 0 1 0 0 0 
8  8 2 58 0 0 0 0 1 1 

は、3被験者がX3及びX5の両方に1をとり、等々。

私はこの質問について助けていただきたいと思います。どうもありがとう。

答えて

4

一つの解決策:

r <- sapply(strsplit(as.character(dt$v1), "[^0-9]+"), as.numeric) 
m <- as.data.frame(t(sapply(r, function(x) { 
     y <- rep(0, 6) 
     y[x[!is.na(x)]] <- 1 
     y 
    }))) 
data <- cbind(data[, c("subject", "sex", "age")], m) 

# subject sex age V1 V2 V3 V4 V5 V6 
# 1  1 1 35 0 1 0 0 0 0 
# 2  2 2 29 0 0 0 0 0 0 
# 3  3 2 31 0 0 1 0 1 0 
# 4  4 1 46 1 1 0 0 0 0 
# 5  5 2 64 0 0 0 1 0 0 
# 6  6 1 57 1 0 0 0 0 0 
# 7  7 1 49 0 0 1 0 0 0 
# 8  8 2 58 0 0 0 0 1 1 

DWINの素晴らしいソリューション、mのように変更することができ続き

m <- as.data.frame(t(sapply(r, function(x) { 
     0 + 1:6 %in% x[!is.na(x)] 
    }))) 
+0

ありがとうございます。あなたのRスクリプトはとてもうまく動作します。 – user187454

+0

更新いただきありがとうございます。もう一つの質問があります。ここでは、v1が最大値「6」をとる単純なデータセットのみを示します。私の実際のデータでは、巨大なので、自分でそれを指定するのではなく、v1の最大値を自動的に決定する簡単な方法はありますか?ありがとう。 – user187454

+0

ありがとう、あなたは非常に役に立ちます。 – user187454

5

あなたは[-4]データにこの結果をCBIND、あなたが必要なものを得ることができます。

0+t(sapply(as.character(data$v1), function(line) 
     sapply(1:6, function(x) x %in% unlist(strsplit(line, split="\\s|\\,"))))) 
#---------------- 
      [,1] [,2] [,3] [,4] [,5] [,6] 
2    0 1 0 0 0 0 
0    0 0 0 0 0 0 
3,5   0 0 1 0 1 0 
2 1   1 1 0 0 0 0 
A,4   0 0 0 1 0 0 
B,1,C   1 0 0 0 0 0 
A and B,3  0 0 1 0 0 0 
5, 6 A or C 0 0 0 0 1 1 
+0

ありがとうございました。あなたのコードは素晴らしいです。 – user187454

関連する問題