私は、データフレームに格納されスーパーマーケットの果物の株式調査の結果を持っていると仮定します。Rのデータフレームに文字ベクトルにバイナリ調査結果を変換
stock <- data.frame(
store = c("Asda", "Booths", "Co-op"),
apple = c(1, 0, 0),
banana = c(1, 1, 0),
coconut = c(0, 0, 0)
)
store apple banana coconut
1 Asda 1 1 0
2 Booths 0 1 0
3 Co-op 0 0 0
のように見えました私の目標:
上記の2分の調査結果の列を各スーパーマーケットの在庫要約の文字ベクトルに変換したい以下のようにKET:
store fruits
1 Asda apple, banana
2 Booths banana
3 Co-op
私のソリューション:
ステップ1:私は、対応する列名とバイナリ列のすべて1を交換するfor
ループを使用:
for(i in names(stock)[2:4]) {
stock[which(stock[[i]] == 1), i] <- i
}
となっております。
store apple banana coconut
1 Asda apple banana 0
2 Booths 0 banana 0
3 Co-op 0 0 0
ステップ2:3
library(tidyverse)
stock <- unite(stock, fruits, apple:coconut, sep = ", ")
くれ
store fruits
1 Asda apple, banana, 0
2 Booths 0, banana, 0
3 Co-op 0, 0, 0
ステップを与える:私は文字ベクトル列に、個々の果物の列を連結するtidyr::unite()
を使用して、私はstringrを使用していた :: str_replace_all()を使用して、不要な0とコンマ区切りをすべて削除します。
library(stringr)
stock$fruits <- str_replace_all(stock$fruits, "0, |, 0|0", "")
これは私が望む結果を得ることができましたが、私の解決策はやや不器用で、特にループ部分が見つかりました。誰かが親切に私とより効率的で簡単な解決策を共有できますか?事前に多くの感謝!ユニークな店舗名、唯一の1と0、無欠損値を仮定し
私の質問タグに注意深い注意を払いながら、物事をはっきりと説明する余分なコーディングコメントのために、親切にも私の質問に2つの解決策を提供してくれてありがとう!私の推奨する 'tidyverse'の解決策はかなりきちんとしていますが、私は' data.table'代替手段の簡潔さにも驚いています。 – elarry
@elarry正直言って、私は 'data.table'のほうが簡潔なコードだけでなく、より大きな問題のパフォーマンス上の理由からも好んでいます。たとえば、[別の質問のベンチマーク](https://stackoverflow.com/a/44755588/3817004)を参照してください。 – Uwe