2017-11-20 17 views
0

データフレームに格納した値を、行列の属する場所に追加したいとします。データフレームの特定の値を行列の特定の位置に追加する

これはデータです:

データフレーム:

df <- read.table(text=' A B C 
    name1 add1 1  
    name2 add1 2 
    name3 add1 3 
    name1 add2 1  
    name2 add2 2 ', header=TRUE) 
    > df 
     A B C 
1 name1 add1 1 
2 name2 add1 2 
3 name3 add1 3 
4 name1 add2 1 
5 name2 add2 2 

がマトリックス:だからdf$Aで一意のエントリはdf$Bma 一意のエントリの行は

ma <- matrix(NA, ncol=2, nrow=3) 
colnames(ma)<-c('add1', 'add2') 
rownames(ma)<-c('name1', 'name2', 'name3') 
> ma 
     add1 add2 
name1 NA NA 
name2 NA NA 
name3 NA NA 

をされていますma

結果の行列は次のようになり:データフレームは、任意の順序であっても、名前のいくつかの組み合わせと加えることができること

> ma 
     add1 add2 
name1 1 1 
name2 2 2 
name3 3 NA 

注(そうまだmaNAが存在すべきである)が存在しなくてもよい

これまでのところ、私は私があなたの提案を感謝されるdfから値を取り、ma

にそれらを書くために動作するコードを生成することができませんでした。

ありがとうございました!

+0

'tidyr ::スプレッド(DF、B、C)の' – useR

+0

可能な重複(HTTPS [ロングワイドフォーマットからデータを再構築するには?]:// stackoverflowの。 com/questions/5890584/how-to-reshape-data-long-to-wide-format) – useR

+0

@KevinRoth。既に回答があった後で、サンプルデータと期待される出力を編集しないようにしてください。最初に投稿を閲覧しているユーザーには、それらの回答が正しく表示されません。 –

答えて

4

私が問題を正しく理解していれば、データを「ロングフォーマット」から「ワイドフォーマット」に変換するだけです。これは、パッケージreshape2を使用すると簡単に実現できます。

library(reshape2) 

dcast(df, A ~ B) 
#  A add1 add2 
# 1 name1 1 1 
# 2 name2 2 2 
# 3 name3 3 3 
+0

ありがとうございます。これは正常に動作しますが、名前と追加の組み合わせが存在しない場合は問題に遭遇します。この点についての質問は明らかではないが、私はそれを修正するだろう。 –

+0

実際にはデータが存在しないNAsが作成されます。非常に簡単なソリューションは、ありがとう! –

+1

@useRまたは@Matt Wの答えも見てください。 'reshape2'パッケージは' tidyr'パッケージの前例です。[here](http://tidyr.tidyverse.org/)を見てください。単純なケースでは、 'tidyr'はおそらくもっと良いでしょう。より複雑な場合にのみ、あなたは' reshape2'に向ける必要があります。私はちょうどそれに慣れています:-)。 –

1

あなたは自分のオリジナルのdfの形状を変更、値を入力した後、空の行列を作成する必要はありませんtidyr

library(tidyr) 

spread(df, B, C) 
2

からspread機能を使用してこれを行うことができます。以下は、あなたがNAの組み合わせを持っている場合でも動作します:

library(tidyr) 

spread(df, B, C) 

結果:

library(tidyverse) 

df %>% 
    spread(B, C) %>% 
    remove_rownames() %>% 
    column_to_rownames("A") %>% 
    as.matrix() 

結果:

 A add1 add2 
1 name1 1 NA 
2 name2 NA 2 
3 name3 3 3 

それとも、行列を好む場合

 add1 add2 
name1 1 NA 
name2 NA 2 
name3 3 3 

データ:

df <- read.table(text=' A B C 
       name1 add1 1  
       name2 add1 NA 
       name3 add1 3 
       name1 add2 NA  
       name2 add2 2 
       name3 add2 3', header=TRUE) 
+0

ありがとう! @Manuel Bickelはすでに実用的なソリューションを提供していましたが、より多くのオプションがあることは素晴らしいです:) –