2017-10-22 8 views
3

매우 적은 재생 코드가 있습니다. 실제 데이터 세트는 더 크고 많은 요소가 있으므로 수동으로 요소를 나열하는 것은 실용적이지 않습니다. dplyr을 계속 사용하고자하는 데이터에 대한 흥미로운 변환도 있습니다.두 데이터 프레임을 바인딩 할 때 요인을 병합하는 방법은 무엇입니까?

library(dplyr) 
a = data.frame(f=factor(c("a", "b")), g=c("a", "a")) 
b = data.frame(f=factor(c("a", "c")), g=c("a", "a")) 
a = a %>% group_by(g) %>% mutate(n=1) 
b = b %>% group_by(g) %>% mutate(n=2) 
rbind(a,b) 

이 생성됩니다

# A tibble: 4 x 3 
# Groups: g [1] 
     f  g  n 
    <chr> <fctr> <dbl> 
1  a  a  1 
2  b  a  1 
3  a  a  2 
4  c  a  2 
Warning messages: 
1: In bind_rows_(x, .id) : Unequal factor levels: coercing to character 
2: In bind_rows_(x, .id) : 
    binding character and factor vector, coercing into character vector 
3: In bind_rows_(x, .id) : 
    binding character and factor vector, coercing into character vector 

이러한 경고는 성가신이며, 나는이 group_by 사용하지 않은 경우 실제로 사라질 것 :

> a = data.frame(f=factor(c("a", "b")), g=c("a", "a")) 
> b = data.frame(f=factor(c("a", "c")), g=c("a", "a")) 
> a = a %>% mutate(n=1) 
> b = b %>% mutate(n=2) 
> rbind(a,b) 
    f g n 
1 a a 1 
2 b a 1 
3 a a 2 
4 c a 2 

명시 적으로 data.frame으로 변환 단지 rbind 전에도 작동 :

> rbind(data.frame(a),data.frame(b)) 
    f g n 
1 a a 1 
2 b a 1 
3 a a 2 
4 c a 2 

기본 변형 R 또는 dplyr rbind/bind_rows을 사용하면 데이터 변환을 위해 dplyr을 계속 사용하면서 문자로 변환하는 대신 해당 요소와 해당 레벨을 자동으로 병합 할 수 있습니까?

수동으로 요소를 병합하는 솔루션을 제안하는 https://stackoverflow.com/a/30468468/388803이 발견되었지만 이는 매우 장황합니다.

내 실제 사용 사례는 두 개의 .csv 파일을 read.table으로로드하고 일부 데이터 변환을 수행 한 다음 데이터를 보완하면서 병합합니다. 현재로서는 데이터 변환이 끝난 후 data.frame(data)으로 전화를 겁니다. dplyr/tibble이 이러한 상황에서 안전하다고 생각되는 이유를 자동으로 병합하지 않는 이유가 궁금합니다. 어쩌면 개선 될 수있는 것입니까?

+0

경고를 피하기 위해 아마도 'factor' 열'levels'을 다른 데이터 세트의 'levels'을 수용하기 전에 변경할 수 있습니다. 'union '과 같은 정렬 – akrun

+0

@akrun 네, 링크 된 게시물에서와 같이 할 수있는 방법 중 하나입니다. 그러나 이것을 수동으로하고 싶지는 않습니다. 실제 데이터 세트에는 많은 요소와 레벨이 있습니다. – eregon

+0

또 다른 해결 방법은'stringsAsFactors = FALSE'를 사용하고'factor'로 원하는 컬럼을 _only 입력 파일을 묶는 것일 수 있습니다. – MichaelChirico

답변

3

data.table을 사용하는 솔루션.
data.framedata.table으로 변환하고 := (dplyr은 필요 없음)을 사용하여 n을 추가하십시오.

a <- data.frame(f=factor(c("a", "b")), g=c("a", "a")) 
b <- data.frame(f=factor(c("a", "c")), g=c("a", "a")) 
library(data.table) 
rbind(setDT(a)[, n := 1], 
     setDT(b)[, n := 2]) 
    f g n 
1: a a 1 
2: b a 1 
3: a a 2 
4: c a 2 
+1

실제로'n'을 선언 할 필요가 없습니다 - 단지'idcol' 인자를 사용하십시오 :'rbind (a, b, idcol = 'n')'. 이것은 코어에서'dplyr' 버그로 보입니다. 우리가'$ n = 1; b $ n = 1; rbind (a, b)'(즉,'base'에서 이것을 수행하십시오), 오류가 없습니다. – MichaelChirico

+0

그래, 그 또 다른 해결 방법입니다. 그러나 물론 현실적인 경우에는 dplyr을 사용하여 이처럼 대체하기가 쉽지 않고 좀 더 현실적인/더 큰 데이터 집합을 사용하는 몇 가지 변형이 있습니다. – eregon

+3

@eregon 1)'dplyr '로 버그를 제출하고 2)이 답변이 당신의 질문을 제기 된대로 풀어주기 때문에 더 많은 유스 케이스를 모방하게하는 것이 좋습니다. – MichaelChirico