2016-04-08 9 views
1

。これらのデータは、次のような形式をとります。分離乱雑データ - 私はいくつかの中に一つの列を分離する必要があるデータセットの整頓部分に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[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 

+でラップすることによってバイナリに強制し、「DF」に新しい列として割り当てる論理行列を得ます'a'列の各ユニーク値のバイナリ出力を取得する場合は、 'a'の文字列を区切り文字(%)で分割し、listdata.frameに変換すると、stack,transform '列をfactorクラスに変更します。 levelsとはtable

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

行うか、我々は分割後qdapToolsから便利な機能mtabulateを使用することができます。

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

私は基本バージョンが好きです。ニースのオプション。 – Simon

関連する問題