2017-02-13 1 views
-1

일반적인 열 (sys_loc_code)을 공유하는 두 개의 데이터 프레임이 있습니다. 첫 번째 데이터 프레임 (df1)에는 1033 개의 행이 있습니다. 두 번째 데이터 프레임 (df2)에는 2751이 있습니다.결합 및 병합이 올바른 행 수를 반환하지 않습니다.

df1과 df2를 결합하여 df1에서 df1과 df2의 모든 열을 유지하면서 새 데이터 프레임을 얻고 싶습니다.

내가 join을 시도

, left_joininner_join (dplyr)에서 간단한 merge. 이들 각각은 2057 개의 행을 반환하며, 이는 단지 df1에있는 것과 일치하도록 1033을 반환해야한다고 생각합니다. df1에서 행만 반환하려면 어떻게해야합니까?

이 문제를 일으킨 데이터 세트를 공유 할 수 없습니다. 그러나 상담 조금 후에, 나는이 최소한의 예와 함께 문제를 다시 만들 수 있습니다 :

df1 <- 
    data.frame(
    sys_loc_code = c("A", "B", "C") 
    , df1Val = 1 
) 


df2 <- 
    data.frame(
    sys_loc_code = c("A", "B", "B", "C", "D") 
    , df2Val = c(1, 1, 2, 1, 1) 
) 

left_join(df1, df2) 

반환 4 개 행을 df1은 세 개의 행이있다.

답변

0

df1$sys_loc_code의 값 중 일부에 대해 df2$sys_loc_code에 여러 항목이 들어있는 것이 가장 큰 문제입니다.

df1$sys_loc_code은 단지 3 개의 값을 가지지 만 그 중 하나 ("B")는 df2$sys_loc_code에 두 번 나타납니다. 이러한 병합은 4 개의 행을 반환한다는 것을 의미합니다. 예 :

left_join(df1, df2) 

sys_loc_code df1Val df2Val 
1   A  1  1 
2   B  1  1 
3   B  1  2 
4   C  1  1 

그래서, 질문에 짧은 대답은 결과가 실제로 작성하는 코드를 기반으로 "올바른"것을 할 수 있습니다. 다른 결과가 발생하기를 원한다면 (예 : 일치 당 df2의 항목 만), 원하는 출력을 정확히 결정해야합니다. 당신이 df2에서 첫 번째 항목을 원하는 경우 예를 들어

는 :

left_join(
    df1 
    , df2 %>% 
    group_by(sys_loc_code) %>% 
    slice(1) 
) 

sys_loc_code df1Val df2Val 
1   A  1  1 
2   B  1  1 
3   C  1  1 


left_join(
    df1 
    , df2 %>% 
    group_by(sys_loc_code) %>% 
    summarise(df2Val = mean(df2Val)) 
) 

sys_loc_code df1Val df2Val 
1   A  1 1.0 
2   B  1 1.5 
3   C  1 1.0 

left_join(
    df1 
    , df2 %>% 
    mutate(aVarToSortOn = 1:n()) %>% 
    group_by(sys_loc_code) %>% 
    slice(which.max(aVarToSortOn)) 
) 
을 제공합니다 제공

sys_loc_code df1Val df2Val aVarToSortOn 
1   A  1  1   1 
2   B  1  2   3 
3   C  1  1   4 

당신이 열에서 고유 한 값을 알고 있다면, 당신은 또한 사실이다 df2

+0

막기 위해 일치하는 선택 filter을 사용할 수 있습니다. df1에서 갖고 싶은 df2에서 찾은 열을 채우기 위해 조회 테이블이나 다른 것을 사용하려고하는 것이 좋습니다. –

+0

그것은 당신의 목표에 달려 있습니다. 나는 aggregate, first, 또는 특정 엔트리를 원하는지에 따라'df2 %> % group_by (sys_loc_code)'와'summarize','slice','filter'를 사용하고,'left_join'을 결과. –

관련 문제