2013-02-07 31 views
7

Her konu (satır) için çeşitli değerler içeren bir sütunun bulunduğu büyük bir veri kümesine sahibim. sadece bu gibi birden çok sütun içine dördüncü sütun daha sonra yarılmışBir sütunu birden çok sütuna bölme

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 

İlk dördüncü sütunda (... A, B, A and B) harfleri çıkarmak için (v1) istiyor ve: İşte basitleştirilmiş örnek dataframe olduğunu : orijinal veri kümesindeki v1 de 3 ve 5 sürer çünkü orijinal veri kümesindeki v1 de 2 sürer, çünkü 1 konu x2 1 sürer

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 konu x3 ve x5 hem de 1 sürer, ve bunun gibi.

Bu sorudaki herhangi bir yardımı takdir ediyorum. Çok teşekkürler.

Sen verilere bu sonucu cbind olabilir

cevap

4

Bir çözüm:

:

DWin müthiş çözümü sonrasında
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 

, m olarak modifiye edilebilir

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

Çok teşekkür ederim. R betiğiniz çok iyi çalışıyor. – user187454

+0

Güncellemeniz için teşekkürler. Benim başka bir sorum var. Burada sadece v1'in “6” maksimum değerini aldığı basit bir veri seti veriyorum. Gerçek verilerimde, çok büyük olduğu için, kendim tarafından belirtmek yerine v1'in maksimum değerini otomatik olarak belirlemenin kolay bir yolu var mı? Teşekkürler. – user187454

+0

Çok teşekkürler, çok yardımcı oluyorsunuz. – user187454

5

[-4] ve neye ihtiyacınız olsun:

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

Çok teşekkür ederim. Kodunuz harika çalışıyor. – user187454

İlgili konular