2017-03-16 12 views
1

編集:価格の中央値と中央値が完全に重ならないようにシミュレーションデータを変更しました。データフレーム列の値を集計/切り捨ての結果に置き換えます。

私はデータフレームに列を持っていますが、これをPriceと呼んでいます。私はここにデータをシミュレートしています:

mydata = data.frame(index = rep(1:1000)) 
mydata$price[1:300] = rnorm(250, mean = 10000, sd = 1000) 
mydata$price[301:550] = rnorm(250, mean = 25000, sd = 1000) 
mydata$price[551:775] = rnorm(250, mean = 75000, sd = 1000) 
mydata$price[776:1000] = rnorm(250, mean = 100000, sd = 1000) 

そして地域のセット、我々はそれがフードを呼び出します:

mydata$hoods = factor(c(rep('hood1',250),rep('hood2',250),rep('hood3',250),rep('hood4',250))) 

その後、私は中央値のビンを作成するために、中間価格で地域を集約します。彼らの中央値段で近所をビンしたいと思います。

agg <- aggregate(mydata$price, by = list(hoods), FUN = median)) 

次に、近傍の中央値のカットバージョンを作成します(実際のデータには24個の近傍があります)。だから、のようなもの:

cut_aggregates <- cut(agg$x, breaks = c(0, 25000, 70000, 110000), labels = c('low','medium','high')) 

は、私は、集約された価格ラベルと、元のデータ内のすべての「hood1」の値を置き換える、というようにすべての地域のためにしたいと思います。最初の250レコードは「低」となります。私はいくつかのネストされたifステートメント、またはブルートフォースハードコーディングを行うことができることを知っています。誰も私がより効率的にすべての値を割り当てることができる方法を知っていますか?私はこれを1000レコード以上のデータセットに使用するかもしれません。ご協力いただきありがとうございます。

最終的な出力では、分類された近傍( '低'、 '中'、高)は、元のデータの価格でcutと同じである必要はありません。この戦略を使用して、「低」、「中」、および「高」の組み合わせ。私は、最初にその集約に基づいて各近隣を分類し、次にその近隣を再編成したいと思います。

+0

は、なぜあなたは、単に '(MYDATA $カットしないでください価格、休憩...) '? –

+0

私はそれについて考えましたが、それは中央値に基づいてそれらを壊すとは思わなかった。 –

+0

ブレークを正しく設定するだけで済みます。 –

答えて

1

これを行う簡単な方法はおそらく最も速く、data.tableを使用することです。

library(data.table) 

# convert mydata into a data.table 
    setDT(mydata) 

# calculate median price by hood 
    mydata[, med := median(price), by=hoods] 

今あなたがいずれかを実行できます。あなたは、各フードのためだけ要約表をしたい場合は、

最後
# replace the original data of `hoods` with the new price labels 
    mydata[, hoods := cut(med, breaks = c(0, 25000, 70000, 110000), labels = c('low','medium','high'))] 

# or create new price labels in a new column 
    mydata[, new_col := cut(med, breaks = c(0, 25000, 70000, 110000), labels = c('low','medium','high'))] 

mydata[, (med = median(price)), by=.(hoods, new_col)] 

> hoods my_cut  V1 
> 1: hood1 low 9916.564 
> 2: hood2 low 24696.864 
> 3: hood3 high 74749.481 
> 4: hood4 high 99852.744 
+0

私はこの方法を試しましたが、最後の行が必要なことをしているようですが、おそらく何かが足りなくなっています –

+0

置換値( 'low'、 'med'、 'high')の新しい列を作成することもできます。フードを新しい値に置き換えることができます。 –

+0

私はいつも新しい列を作成して、元のデータをそのまま参照用に保持することを好む –

1

編集:アプローチ1

mydata <- within(mydata, med <- ave(price, hoods, FUN = median)) 
mydata$new_label <- cut(mydata$med, breaks = c(0, 25000, 70000, 110000), labels = c('low','medium','high')) 

# index  price hoods  med new_label 
# 1  1 10084.756 hood1 10014.38  low 
# 2  2 10226.460 hood1 10014.38  low 
# 3  3 10432.556 hood1 10014.38  low 
# 4  4 10558.065 hood1 10014.38  low 
# 5  5 10059.755 hood1 10014.38  low 
# 6  6 9885.359 hood1 10014.38  low 

Approach2:

agg$labsmydatahoodsのレベルごとに一意ではないので、それによりループを使用して個別にラベルを再割り当てするために良くなりますhoodsのレベルをagg$labsの値でマッピングします。

あなたはmydatahoodsの各レベルのagg$labsでユニークなラベルを持っていた場合、ちょうどmydata$hoods <- factor(mydata$hoods, levels = agg$Group.1, labels = agg$labs)を行うことによって、ラベルを再割り当てすることは非常にシンプルになります。しかし、あなたはagg$labsにレベルが重複しているので、以下の手順に従います。

mydata$hoods <- as.character(mydata$hoods) # convert factor to character 
agg$labs <- as.character(agg$labs) # convert factor to character 

for(i in seq_len(nrow(agg))) { # change labels for hoods in mydata 
    mydata[ mydata$hoods %in% agg$Group.1[ i ], "hoods" ] <- agg$labs[i] 
} 
mydata$hoods <- factor(mydata$hoods) # convert hoods back to factor 

unique(mydata$hoods) # output 
# [1] low medium high 
# Levels: high low medium 

データ:あなたはset.seed()機能で異なるシードを選択した場合

set.seed(200) 
mydata = data.frame(index = rep(1:1000)) 
mydata$price[1:250] = rnorm(250, mean = 10000, sd = 1000) 
mydata$price[251:500] = rnorm(250, mean = 25000, sd = 1000) 
mydata$price[501:750] = rnorm(250, mean = 75000, sd = 1000) 
mydata$price[751:1000] = rnorm(250, mean = 100000, sd = 1000) 
mydata$hoods = factor(c(rep('hood1',250),rep('hood2',250),rep('hood3',250),rep('hood4',250))) 
agg <- with(mydata, aggregate(price, by = list(hoods), FUN = median)) 
agg$labs <- cut(agg$x, breaks = c(0, 25000, 70000, 110000), labels = c('low','medium','high')) 

agg 
# Group.1   x labs 
# 1 hood1 10014.38 low 
# 2 hood2 25021.96 medium 
# 3 hood3 74963.40 high 
# 4 hood4 100019.88 high 

agg内のデータが変化します。

+0

私は 'ave'関数に慣れていませんでした。ありがとう! –

関連する問題