2016-04-08 22 views
1

Veri kümesinin bir bölümünü düzenli hale getirmek için, bir sütunu birçoğuna ayırmam gerekiyor. Bu veriler buna benzer şekildedir:R - ODK temizlemede düzensiz verilerin ayrılması

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 en ayrı fonksiyon alışkanlık iş yapmak ve ben en iyi fikir böyle ifelse tabloların dizisidir:

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 

iyi yolu nedir Böyle bir gezintiye gitmek için. Veri toplama için Açık Veri Kiti (ODK) ile çalışan birçok kişinin buna rastlayacağına eminim.

cevap

2

Biz kalıpların (örneğin 1, 2) sapply ile, mantıksal bir matris elde + sarılarak ikiliye zorlamak ve '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 

yeni sütunlar olarak atamak döngü Eğer bu 'a' sütunundaki her bir benzersiz değer için ikili çıktıyı elde etmekse, sınırlamaları (%) 'a' olarak bölebiliriz, liststack, transform 'değerleri' kullanarak data.frame'a dönüştürülebilir. belirterek factor sınıfına sütun levels ve table

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

yapmak Ya da biz ayrıldıktan sonra qdapTools elverişli bir işlevi mtabulate kullanabilirsiniz.

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

Temel sürümü severim. Güzel seçenekler. – Simon

İlgili konular