データの各列は再スケーリングされ、0から100までのビンに入れられます。ビン列はモデルのフィーチャとして使用されます。それぞれのビンを別々にテストするために、私は各ビンの列をその値ごとに別々の列に分割したいと思います。新しい列は、セル内の値が列のビンと一致するかどうかによって、0または1のいずれかを保持します。これに複数の列の個別の列に一意の値を分割する
row values
1 10
2 20
3 30
4 40
5 10
6 30
7 40
:
row values_10 values_20 values_30 values_40
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 1
5 1 0 0 0
6 0 0 1 0
7 0 0 0 1
この強引なアプローチは、仕事をしていませんが、より良い(非ループ)方法がなければならない:
values <- c(10,20,30,40,10,30,40)
dat <- data.frame(values)
columnNames <- unique(dat$values)
for(n in 1:length(columnNames))
{
dat[as.character(columnNames[n])] <- 0
}
columnNames2 <- colnames(dat)
for(c in 2:ncol(dat))
{
hdr <- columnNames2[c]
for(r in 1:nrow(dat))
{
if(dat$values[r]==as.integer(hdr))
dat[r,c]=1
}
}
このようなものから、どうもありがとう!!
EDIT
これらはすべての偉大な答えですが、あなたにみんなに感謝します。行列、テーブル、またはデータテーブルのいずれの最終オブジェクトにも、個別のビン列(ソース列なし)のみが含まれます。以下のソリューションは、2000年以上のソース列でどのように使用できますか?以下の私のフォローアップの質問への回答に基づいて
EDIT2
は、将来的にこの質問に来る人のための各方法の実装です。
# read in some data with multiple columns
df_in <- read.table(text="row val1 val2
1 10 100
2 20 200
3 30 300
4 40 400
5 10 100
6 30 300
7 40 400", header=TRUE, stringsAsFactors=FALSE)
# @Zelazny7 's method using a matrix
df_in$row <- NULL
col_names <- names(df_in)
for(c in 1:length(col_names)){
uniq <- unlist(unique(df_in[col_names[c]]))
m <- matrix(0, nrow(df_in), length(uniq),
dimnames = list(NULL, paste0(col_names[c], "_", uniq)))
for (i in seq_along(df_in[[col_names[c]]])) {
k <- match(df_in[[col_names[c]]][i], uniq, 0)
m[i,k] <- 1
}
if(c==1)
df_out <- m
else
df_out <- cbind(df_out,m)
}
# @P Lapointe 's method using 'table'
col_names <- names(df_in)
for(c in 2:length(col_names)){
m <- table(df_in$row,df_in[[col_names[c]]])
uniq <- unlist(unique(df_in[col_names[c]]))
newNames <- toString(paste0(col_names[c],'_',uniq))
if(c==2){
df_out <- m
hdrs <- newNames
}
else{
df_out <- cbind(df_out,m)
hdrs <- paste(hdrs,newNames,sep=", ")
}
}
colnames(df_out) <- unlist(strsplit(hdrs, split=", "))
# @bdemarest 's method using 'data.table'
# read in data first
library(data.table)
df_in = fread("row val1 val2
1 10 100
2 20 200
3 30 300
4 40 400
5 10 100
6 30 300
7 40 400")
df_in$count = 1L
col_names <- names(df_in)
for(c in 2:length(col_names)-1){
m = dcast(df_in, paste('row', '~', col_names[c]), value.var="count", fill=0L)
uniq <- unlist(unique(df_in[,get(col_names[c])]))
newNames <- toString(paste0(col_names[c],'_',uniq))
m$row <- NULL
if(c==2){
df_out <- m
hdrs <- newNames
}
else if(c>2){
df_out <- cbind(df_out,m)
hdrs <- paste(hdrs,newNames,sep=", ")
}
}
colnames(df_out) <- unlist(strsplit(hdrs, split=", "))
すべての回答は適切かつ有用であり、最善の回答が最も早い初期応答に与えられました。もう一度あなたの助けに感謝します!
dcast' – mtoto
ダミー列を別々に作成するのではなく、 'cut'を使用してデータの単一の列を因子カテゴリにグループ化することができます(この場合は、順序付け因子が必要です)。 Rのモデル関数は、一般に、モデルに因子列を含めると自動的にダミー列を作成します。もしそうでなければ、 'model.matrix'を使ってダミーカラムを作ることができます。しかし、それはデータをグループ化することが理にかなっていますか?それはちょうど情報を捨てないのですか? – eipi10
これは、あなたが探している行列の基本構造を取得します: 'df $ I = 1; t(tidyr :: spread(df、key = row、value = I))' – Vlo