2017-11-20 19 views
0

데이터 프레임에 저장 한 값을 해당 매트릭스가 속한 행렬의 위치에 추가하고 싶습니다. 데이터 프레임의 특정 값을 행렬의 특정 위치에 추가

dataframe

:

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에서

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 

그래서 고유 항목이 df$B에서 ma 고유 한 항목의 행있는 있습니다

데이터입니다 ma

결과 행렬은 다음과 같이 보일 것이다 :

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

dataframe 임의의 순서에있을 수 있습니다, 이름의 일부 조합 및 존재하지 않을 수 있습니다 추가 (그래서 여전히이 있어야한다 maNA)

지금까지, 나는 당신의 제안을 감사하게 될 것입니다 ma

로를 df에서 값을 쓰는 작업 코드를 생성 할 수 없습니다.

감사합니다.

+0

'tidyr :: 확산 (DF, B, C)의' – useR

+0

가능한 복제 (HTTPS [너비 형식으로 데이터를 재 형성하는 방법?] : // 유래. 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

고맙습니다. 이것은 잘 작동하지만 이름과 add의 조합이 존재하지 않으면 문제가 발생합니다. 이 점에 관한 질문은 분명하지 않습니다. 나는 그것을 고칠 것입니다. –

+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은 이미 작동중인 솔루션을 제공했지만 더 많은 옵션을 사용하는 것이 좋습니다 :) –