Создайте новый столбец, формула которого зависит от значения ячейки другой строки

#r

#r

Вопрос:

Как мне создать новый столбец, формула которого зависит от значения ячейки другой строки

   x y  z
1 a 1 10
2 a 2 20
3 a 3 30
4 b 1 40
 

Это мои примерные данные. Я хочу, чтобы конечный результат был следующим

   x y  z prevY
1 a 1 10 0
2 a 2 20 10
3 a 3 30 20
4 b 1 40 0
 

где prevY — значение z для x=current_x_val и y=current_y_val-1 0, если недоступно.

Как мне этого добиться.

Мой прогресс до сих пор :

 data[data$x == "a" amp; data$y==2-1,3]
 

Я вручную ввожу значения и получаю prevY для каждой строки. но как мне сделать это для всех строк за один снимок?

Ответ №1:

Или data.table решение (аналогичное MrFlick), но быстрее для большого набора данных

 library(data.table)
setDT(dat)[, prevY := c(0, z[-length(z)]), by = x]
 

Ответ №2:

Здесь вы можете использовать ave() функцию для выполнения преобразований на уровне группы (здесь разные преобразования для каждого значения x).

 dd$prevY <- with(dd, ave(z, x, FUN=function(x) head(c(0,x),-1)))
 

Здесь мы берем значения z для каждого значения x и добавляем ноль спереди и удаляем последнее значение. Затем мы присваиваем это обратно data.frame.

Предполагается, что все y значения отсортированы внутри каждой x группы.

Результат

   x y  z prevY
1 a 1 10     0
2 a 2 20    10
3 a 3 30    20
4 b 1 40     0
 

Комментарии:

1. Да, это то, что нужно, хотя я предпочитаю: c(0,head(x,-1)) в функции.

2. в чем причина использования with ? ave(z, x, FUN=функция (x)c(0,x[-длина (x)]))) кажется, я получаю результат.

3. @user2070649 Вы случайно прикрепили свой data.frame? Я просто предполагал, что x, y и z живут только внутри вашего data.frame, который я вызвал dd здесь. Если они у вас есть в качестве глобальных переменных, вам не нужны with .

4. @thelatemail Я всегда возвращаюсь к этим двум синтаксисам. Но я думаю, что в данном случае ваше предложение более чистое, поэтому я изменил его.