2017-03-09 4 views
2

데이터 세트가 두 개 있습니다 :R에 누락 된 열 이름이있는 다른 데이터 프레임의 열 이름 바꾸기?

a. 이처럼 보이는 데이터 프레임 :

 SpeciesA SpeciesB SpeciesC SpeciesD SpeciesE SpeciesY SpeciesZ 
Site1  1   0  4  6   2  5  2 
Site2  1   0  4  6   2  5  3 
Site3  1   0  4  6   2  5  4 
Site4  1   0  4  6   2  5  5 

(참고 : 로우 값은 동일하지이 여기 표현하기위한 목적이다.)

B. 이처럼 보이는 또 다른 데이터 세트 : 어떤 종 (. 예를 들어 SpeciesZ, SpeciesY가)에 해당 "주문"을하지 않는 것을

Order   Species 
Order1   SpeciesA 
Order1   SpeciesB 
Order2   SpeciesC 
Order2   SpeciesD 
Order3   SpeciesE 

공지 사항 (B).

data-set (2)의 Order 열을 data-frame (1)의 해당 Species와 일치시키고 동일한 Order의 값 (여러 종이있는 경우)을 더하고 싶습니다. 종 (eg.SpeciesY, SpeciesZ)에 해당하는 주문이없는 경우, 나는 NULL로 열 이름을 변경하고 (나는 단계 모두 필요합니다) 다음을 제거 할

전 최종 출력

  Order1 Order1 Order3 NULL NULL 
Site1  1   10  2  5  2 
Site2  1   10  2  5  3 
Site3  1   10  2  5  4 
Site4  1   10  2  5  5 

최종 출력은

  Order1  Order2 Order3 
Site1  1    10   2     
Site2  1    10   2      
Site3  1    10   2      
Site4  1    10   2    

dplyr 또는 melt/reshape 함수를 사용하여 대부분의 경우 코드가 질문 asked here의 확장이다. 그러나 일부 종에 해당하는 값이 없다는 오류가 나오면 동일한 분석을 수행하기가 어려워 짐

답변

2

한 가지 방법은 match, split으로 데이터 집합의 하위 집합으로 색인을 만드는 것입니다. list 요소를 통해 Order 열, 루프를 사용하고 rowSums

i1 <- match(colnames(df1), df2$Species, nomatch = 0) 
data.frame(lapply(split.default(df1[i1], df2$Order[i1]), rowSums)) 
#  Order1 Order2 Order3 
#Site1  1  10  2 
#Site2  1  10  2 
#Site3  1  10  2 
#Site4  1  10  2 

를 얻을 또는 우리가 '긴'형식으로 첫 번째 데이터 집합을 변환 할 수 있습니다, 열별로 그룹화 두 번째로 조인 sum의를 얻을 수 값 열 'wide'로 다시 바꾼다

library(tidyverse) 
rownames_to_column(df1, "rn") %>% 
     gather(Species, Val, -rn) %>% 
     left_join(., df2, by = "Species") %>% 
     na.omit() %>% 
     group_by(rn, Order) %>% 
     summarise(Val = sum(Val)) %>% 
     spread(Order, Val) 
+0

나는 어떤 일을하는지 잘 모르겠다.하지만 이걸 실행할 때, i1은 df1의 열 개수보다 큰 값을 차지하고있다. 예. 나는 (1,522,4 .. 등) 벡터의 i1을 가지고있다. 그 때 df1 [i1]을 실행하면 정의되지 않은 열이 선택되었음을 나타냅니다. – Ash

+0

위의 설명은 코드 – Ash

+1

의 Option (1)을 참조한 것입니다. 내 생각에는 결함이 있다고 생각해. 이제 잘 작동합니다! – Ash