вставьте строку после группы и заполните значениями следующей строки - PullRequest
0 голосов
/ 31 декабря 2018

Я хотел бы вставить новую строку после каждой группы (grp) и заполнить некоторые новые столбцы значениями следующей строки, а некоторые - предыдущими значениями строки

Я пытаюсь использовать:

x<-rbind(setDT(DF), DF[,.SD[.N], grp][, color := shift(color,1L, type = "lag")][, Lat:= shift(Lat,1L, type = "lead")])[order(id)]

на DF:

a <- c(1,2,3,4,5,6,7,8,9,10)
b <- c(10,20,30,40,50,60,70,80,90,100)
c <- c("a","a","b","b","b","a","a","b","c","c")
d <- c(11,23,67,89,90,100,101,123,200,290)
df <- data.frame(color=a, Lat=b, grp=c, id=d)   

Возможно, я неправильно использую shift () и не могу заставить его работать.

спасибо

ожидаемые результаты будут:

   color Lat grp  id
1      1  10   a  11
2      2  20   a  23
new row with color from previous row, Lat from next row, grp from previous and if from next
3      3  30   b  67
4      4  40   b  89
5      5  50   b  90
new row as before
6      6  60   a 100
7      7  70   a 101
new row as before
8      8  80   b 123
new row as before
9      9  90   c 200
10    10 100   c 290

1 Ответ

0 голосов
/ 31 декабря 2018

Мы создаем два lead столбца, то есть значения следующей строки 'Lat' и 'id', прежде чем мы сделаем группу с помощью rleid из 'grp'.Здесь rleid проверяет, являются ли смежные элементы 'grp' одинаковыми или нет.Если он отличается, он присваивает новый идентификатор этому элементу

library(data.table)
setDT(df)[, c("LatN", "idN") := shift(.SD, type = 'lead'), .SDcols = c('Lat', 'id')]

Получить last наблюдение выбранных столбцов с помощью rleid из 'grp'

tmp <- df[, .(color = color[.N], Lat = LatN[.N], id = idN[.N], grp = grp[.N]), 
       .(grp1 = rleid(grp))][, grp1 := NULL]

rbind с исходными столбцами набора данных, order - цветом и удалите все строки NA

na.omit(rbind(df[,.(color, Lat, id, grp)], tmp)[order(color)])
#     color Lat  id grp
# 1:     1  10  11   a
# 2:     2  20  23   a
# 3:     2  30  67   a
# 4:     3  30  67   b
# 5:     4  40  89   b
# 6:     5  50  90   b
# 7:     5  60 100   b
# 8:     6  60 100   a
# 9:     7  70 101   a
#10:     7  80 123   a
#11:     8  80 123   b
#12:     8  90 200   b
#13:     9  90 200   c
#14:    10 100 290   c
...