2016-12-27 70 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)

相关问题