配列列は最新であり、他は目標です
配列の列があり、それを複数のバイナリに分割したいと思います。を使用してすべての列を作成しました
dat[,unique(unlist(df$array_column))] = 0
ifelse
ステートメントを使用して、必要に応じて列を「1」に設定しようとしましたが、を使用%in%
しても機能しませんifelse
。ネストされたforループを作成することもできますが、数百万の行があり、それよりも高速なソリューションを探しています。
testdf = data.frame('a'=c(1,2,3,4,5),'array_column'=c('a-b-c','b-a','c-d','d-e-e','e-a'),stringsAsFactors = F)
testdf$array_column = strsplit(testdf$array_column,'-')
問題は、ベクトルのリストをどのようにバイナリ行列/data.frameに変換するかということだと思います。
これが解決策です
testdf = data.frame('a'=c(1,2,3,4,5),'array_column'=c('a-b-c','b-a','c-d','d-e-e','e-a'),stringsAsFactors = F)
testdf$array_column = strsplit(testdf$array_column,'-')
library('plyr')
# Creates a list of data.frames with 1s for each value observed
binary <- lapply(testdf$array_column, function(x) {
vals <- unique(x)
x <- setNames(rep(1,length(vals)), vals);
do.call(data.frame, as.list(x))
})
# Joins into single data.frame
result <- do.call(rbind.fill, binary)
result[is.na(result)] <- 0
result
# a b c d e
# 1 1 1 1 0 0
# 2 1 1 0 0 0
# 3 0 0 1 1 0
# 4 0 0 0 1 1
# 5 1 0 0 0 1
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加