2016-10-25 6 views
0

데이터 프레임의 고유 한 행을 가져 와서 다른 속성 행과 조인하고 싶습니다. 다음으로 품종 수를 셀 수있게하고 싶습니다. 특정 유형 또는 원산지의 고유 한 과일 수.R에서 데이터 프레임을 통합하는 우아한 방법?

fruit <- as.data.frame(unique(fruit[,2])) #get a list of unique fruits 
colnames(fruit)[1] <- "fruit" #this won't rename the column and I don't know why... 
fruit_summary <- join(fruits, fruit_class, by="fruit" #create a data frame that I can query 
count(fruit_summary, "origin") #for eg, summarise the number of fruits of each origin 
:

여기 문제에 대한 내 서투른 솔루션입니다
fruit_class <- read.table(header=TRUE, text="fruit type origin 
apple pome asia 
         banana berry asia 
         orange citrus asia 
         pear pome newguinea") 

: 두 번째 데이터 프레임 내 속성이 있습니다

fruits <- read.table(header=TRUE, text="shop fruit 
        1 apple 
        2 orange 
        3 apple 
        4 pear 
        2 banana 
        1 banana 
        1 orange 
        3 banana") 

:

첫 번째 데이터 프레임은 과일의 내 목록이 있습니다

제 질문은 다음과 같습니다 : 어떻게하면 더 우아하게 표현할 수 있습니까? 2 차적으로 : 열의 이름을 바꿀 수없는 이유는 무엇입니까? 사전

+3

:'집계 (과일 ~ 기원, 병합 (과일, fruit_class), FUN = 길이)'또는 dplyr : '과일 %> % left_join (fruit_class) %> % 수 (원점)' – alistaire

+1

귀하 기본 코드는 아시아에서 온 과일 12 개와 새로운 기니에서 얻은 과일 4 개가 있다는 것을 말해 주므로 과일 $ 가게 열을 요약합니다 (사용하지 않으려 고합니다). 결과는 아시아 (사과, 바나나 및 오렌지)에서 3 과일 및 새로운 기니 (배)에서 하나이어야합니다. – setbackademic

+0

필자는 7과 1을 얻었지만, 'fruit_class'의 출처를 계산하려면'count (fruit_class, origin)'를 사용하십시오. 'fruits_class %> % semi_join (fruits) %> % count (origin)'를 사용하면'과일 '에 먼저 있는지 확인하려는 경우이 경우 동일한 결과를 반환합니다. 그리고 어느 쪽도'가게'를 합산하지 않고있다; 그들은 행을 세고 있습니다. – alistaire

답변

0

에서

덕분에 간단하게

table(fruit_class$fruit, fruit_class$origin) 

을 수행하기가 colSums()와 지역 번호를 추가 할 수 있습니다 당신에게

 asia newguinea 
apple  1   0 
banana 1   0 
orange 1   0 
pear  0   1 

을 제공합니다. 에없는 과일이 있다면 어쨌든 그것에 대한 원산지 데이터가 없으므로 fruits 데이터 프레임이 필요한 이유를 생각할 수 없습니다.

그런데 코드 예제에서 colnames(fruit)[1] <- "fruit"이 작동해야하지만 어쨌든 코드 이름은 1 요소 길이이므로 colnames(fruit) <- "fruit" 만 필요합니다.

0

여기에 data.table 솔루션이 있습니다. 기본에서

library(data.table) 
setDT(fruit_class)[, uniqueN(fruit), by=type] 
#  type V1 
# 1: pome 2 
# 2: berry 1 
# 3: citrus 1 

setDT(fruit_class)[, uniqueN(fruit), by=origin] 
#  origin V1 
# 1:  asia 3 
# 2: newguinea 1