2017-08-07 4 views
0

を分離:以前にホットエンコード属性Att_1がコンマとして回収したこと私はこのスキーマに従ってRのデータフレームを変換したいリスト

enter image description here

注IDyのために単一のセル内に区切られたリスト。

Rでこれを行うにはどうすればいいですか(例:tidyr関数)?

test <- data.frame(ID = c("IDx", "IDy"), Att_1_1 = c(0,0), Att_1_2 = c(1,1), Att_1_3 = c(0, 1), Att_2 = c(1,1), Att_3 = c(1,0)) 

答えて

3

元のデータセットと「IDが」でleft_join、次の操作を行うことができます。ここ

# set up new dataframe 
res <- test[-(2:4)] 

# add new varible 
res$Att_1 <- apply(test[, 2:4], 1, function(x) c(names(test)[2:4][as.logical(x)])) 

applyはサブセットdata.frameの行をループし、行のセルの値は、論理サブセットを使用して、1に等しい名前のベクトルを返します。

これは

res[["Att_1"]] <- ... 

も動作することを

res 
    ID Att_2 Att_3   Att_1 
1 IDx  1  1   Att_1_2 
2 IDy  1  0 Att_1_2, Att_1_3 

注意を返します。

+0

もう一つ質問。 res $ Att_1の代わりにres [、 "Att_1"]を書くことでコードを変更しようとしましたが、動作しません。 applyコマンドはリストを返します。それの背後にある魔法は何ですか? ;) – CodingButStillAlive

+0

'[< - 。data.frame'と' $ < - 。data.frame'のコードを調べることで、多かれ少なかれアイデアを得ることができます。最初のものはかなり長く、 '[< - 'は '$ < - 'よりも多くの場合を処理しなければならないので、いくつかのチェックが含まれています。途中で約3/4が表示され、警告メッセージの後に 'new.cols < - new.cols [seq_len(p)]という行が続きます。私はこれが最初の要素を含むために 'apply'からのリスト出力を切り捨てると信じています。 '$ < - 'のコードははるかに短く、最終的に上記の答えで追加した 'x [[name]] < - value'を使います。 – lmo

+1

この包括的な説明をありがとう。 Btw。私はこの行を明示的に貼り付けて置き換え、要素をカンマ区切りの文字列に結合しました。この素晴らしい助けをありがとう。宜しくお願いします! – CodingButStillAlive

3

OPはtidyr機能を要求するように、我々は「valが」「のID」ごとにグループ化され、1 filter行、「長い」フォーマットにデータセットをgatherpastesummariseを作成するための「キー」欄Dの列「Att_1」とベースRで

library(tidyverse) 
test %>% 
    gather(key, val, Att_1_1:Att_1_3) %>% 
    filter(val==1) %>% 
    group_by(ID) %>% 
    summarise(Att_1 = toString(key)) %>% 
    left_join(df1[-(2:4)], ., by = "ID") %>% 
    select(ID, Att_1, Att_2, Att_3) 
# ID   Att_1 Att_2 Att_3 
#1 IDx   Att_1_2  1  1 
#2 IDy Att_1_2, Att_1_3  1  0 
+1

@Sotosありがとう、私はOPによって示されたイメージに基づいてコーディングしていました。 OPは – akrun

+0

と変わったのを見ていませんでした。素晴らしい!本当にありがとう!しかし、正直言って、私は本当に簡単な解決策を望んでいました。つまり、提示されたソリューションは本当に芸術です。私の真のデータフレームは本当に、本当に巨大で複雑です。 PS:テストデータフレームを画像(IDではなくID)と一致させるために投稿を編集しました。 – CodingButStillAlive

+0

おそらく、非整頓機能を備えたより簡単なソリューションがあります。 – CodingButStillAlive

関連する問題