2016-11-09 1 views
3

내가 namesgroup이 아닌 첫 번째없는 이름에 대한 좀하고 싶습니다, 여기에 다음과 같은 간단한 예Dplyr : 그룹별로 누락 된 첫 번째 문자열을 찾는 방법은 무엇입니까?

group <-c('A','A','A','B','B','B','B') 
names<- c(NA,'fred',NA,'josh','josh',NA,NA) 
data=data_frame(group,names) 

> data 
# A tibble: 7 × 2 
    group names 
    <chr> <chr> 
1  A <NA> 
2  A fred 
3  A <NA> 
4  B josh 
5  B josh 
6  B <NA> 
7  B <NA> 

을 고려하십시오. 어떻게해야합니까? coalescefirst을 사용하는 아래 해결책은 실패합니다.

data %>% group_by(group) %>% mutate(first_non_missing = first(names), 
            first_non_missing_alt = coalesce(names)) %>% ungroup() 

# A tibble: 7 × 4 
    group names first_non_missing first_non_missing_alt 
    <chr> <chr>    <chr>     <chr> 
1  A <NA>    <NA>     <NA> 
2  A fred    <NA>     fred 
3  A <NA>    <NA>     <NA> 
4  B josh    josh     josh 
5  B josh    josh     josh 
6  B <NA>    josh     <NA> 
7  B <NA>    josh     <NA> 

사실, 그룹 A를 들어, first_non_missing는 ..

많은 감사 세 관측 fred해야합니다!

+1

예상되는 결과는 무엇입니까? 발견 된 이름은 주어진 그룹의 새로운 변수에 모든 값을 채워야합니까? –

+0

네, 그냥 정기적 인 돌연변이. 동일한 크기의 원본 데이터 프레임 및 각 그룹의 '이름'에 첫 번째 누락 된 문자열을 반복하는 새로운 열 –

+0

감사하지만 친구가 누군가보다 빠릅니다 : D –

답변

8

요약하고는 먼저 당신은 여전히 ​​모든 행을 원하는 경우에 which

data %>% 
    group_by(group) %>% 
    summarise(first_non_missing = names[which(!is.na(names))[1]]) 

group first_non_missing 
    <chr>    <chr> 
1  A    fred 
2  B    josh 

을 제공하여 비 누락 mutatesummarise 교체 발견, 여기에 그룹 당 하나 개의 항목을 줄 것이다 .

+0

예. 감사! 게다가, 나는 여기에서 작동하지 않는다는 것을 감안할 때'합병 (coalesce) '이해야 할 일을 모른다. ... –

+1

다행이다. 나는 '합치다'가 그 안에있는 것이 아니라 가로 질러서 사용되도록 고안되었다고 믿는다. 즉, 세 개의'name' 컬럼이 있다면 각 행에 대해 누락되지 않은 값을 가진 첫 번째 컬럼을 리턴합니다. –

+0

가장 기괴한 기능은 항상 lol –

관련 문제