2016-12-27 60 views
3

我已經廣泛地研究了一個解決方案的堆棧溢出,但還沒有找到一個適用於我的解決方案。 我有一個數據幀,看起來是這樣的:爲每個組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的末尾插入新行。在這一行中,我希望'id'和'time'與之前的觀察結果相同。我想經緯度是'394681.4'和'6017550'(對應於所有id的結束位置)。

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'轉換爲'data.table'(setDT(df1)),按'id'分組,得到tail的最後一行,將新值rbind與原始數據集分配爲'緯度'和'經度', 'id'爲order

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

使用A基礎R溶液分裂申請-結合概念。

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

返回

 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成data.frames的列表,lapplyrbind S中的最後行到每一data.frame,和do.callrbind S上的所得的列表data.frames。每個data.frame的最後一行使用within生成,它返回它給出的data.frame的修改版本。 nrow用於選擇最後一行。參考@ akrun的回答,x[nrow(x),]可以替換爲tail(x, 1)

相關問題