2016-04-08 87 views
1

要整理一部分數據集,我需要將一列分成幾個。這些數據需要類似這樣的形式:在R-ODK清理中分離不整潔的數據

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的獨立功能不會做的工作,我有最好的想法是一系列ifelse語句,就像這樣:

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 

什麼是最好的方式去做這樣的整理。我相信很多與Open Data Kit(ODK)合作收集數據的人都會遇到這種情況。

回答

2

我們可以循環模式(即1,2)sapply,得到一個邏輯矩陣,通過用+包裹強制爲二進制並將其指定爲在「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 

新列如果這是爲'a'列中的每個唯一值獲得二進制輸出,則可以使用分隔符(%)將字符串拆分爲'a',可以使用stack,transform將輸出list轉換爲data.frame'值'列指定factorlevels並做table

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

或者,我們可以分割後使用便捷的功能,mtabulateqdapTools

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

我喜歡基本版本。不錯的選擇。 – Simon