2016-12-27 2 views
3

솔루션에 대한 스택 오버 플로우를 광범위하게 살펴 보았지만 아직 저의 솔루션을 찾지 못했습니다. 나는이 같은 형태의 데이터 프레임이 : 나는 각 ID의 끝에서 새 행을 삽입 할각 그룹 ID에 대한 데이터 프레임에 새 행 삽입

id time latitude longitude 
A  11:10 381746.0 6008345 
A  11:11 381726.2 6008294 
B  10:56 381703.0 6008214 
B  10:57 381679.7 6008134 
C  4:30 381654.4 6008083 
C  4:31 381629.2 6008033 

합니다. 이 행에서 나는 'id'와 'time'을 이전 관측과 동일하게하고 싶습니다. 위도와 경도가 '394681.4'와 '6017550'(모든 이드의 끝 위치에 해당)이되고 싶습니다.

id time latitude longitude 
A  11:10 381746.0 6008345 
A  11:11 381726.2 6008294 
A  11:11 394681.4 6017550 
B  10:56 381703.0 6008214 
B  10:57 381679.7 6008134 
B  10:57 394681.4 6017550 
C  4:30 381654.4 6008083 
C  4:31 381629.2 6008033 
C  4:32 394681.4 6017550 

누구나 해결책을 생각할 수 있습니까? Dplyr 또는 데이터 테이블 솔루션이 선호됩니다.

답변

5

data.table으로이를 수행 할 수 있습니다. 'data.frame'을 'id'로 그룹화 한 'data.table'(setDT(df1))로 변환하고, 마지막 행을 tail으로 가져오고, 새 값으로 '위도'와 '경도'를 할당하고 rbind으로 원래 데이터 세트를 order에 의해 'id'.

library(data.table) 
rbind(setDT(df1), df1[, tail(.SD, 1) , by = id 
     ][, c("latitude", "longitude") := .(394681.4, 6017550) 
     ])[order(id)] 
# id time latitude longitude 
#1: A 11:10 381746.0 6008345 
#2: A 11:11 381726.2 6008294 
#3: A 11:11 394681.4 6017550 
#4: B 10:56 381703.0 6008214 
#5: B 10:57 381679.7 6008134 
#6: B 10:57 394681.4 6017550 
#7: C 4:30 381654.4 6008083 
#8: C 4:31 381629.2 6008033 
#9: C 4:31 394681.4 6017550 

또는 dplyr을 사용하여 유사한 방법

library(dplyr) 
df1 %>% 
    group_by(id) %>% 
    summarise(time = last(time)) %>% 
    mutate(latitude = 394681.4, longitude = 6017550) %>% 
    bind_rows(df1, .) %>% 
    arrange(id) 
2

사용하는 기본 R 솔루션 개념을 분할 --결합하여 적용합니다. data.frames 목록에

 id time latitude longitude 
A.1 A 11:10 381746.0 6008345 
A.2 A 11:11 381726.2 6008294 
A.21 A 11:11 394681.4 6017550 
B.3 B 10:56 381703.0 6008214 
B.4 B 10:57 381679.7 6008134 
B.41 B 10:57 394681.4 6017550 
C.5 C 4:30 381654.4 6008083 
C.6 C 4:31 381629.2 6008033 
C.61 C 4:31 394681.4 6017550 

split 넘김 data.frame를 반환

do.call(rbind, lapply(split(df, df$id), 
         function(x) rbind(x, 
         within(x[nrow(x),], {latitude <- 394681.4; longitude <- 6017550})))) 

각 data.frame에 lapplyrbind의 마지막 행 및 do.callrbind의 결과리스트의 data.frames. 각 data.frame의 마지막 행은 제공된 data.frame의 수정 된 버전을 반환하는 within을 사용하여 생성됩니다. nrow은 마지막 행을 선택하는 데 사용됩니다. @ akrun의 대답을 참조하면 x[nrow(x),]tail(x, 1)으로 바꿀 수 있습니다.

관련 문제