#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 Я всегда возвращаюсь к этим двум синтаксисам. Но я думаю, что в данном случае ваше предложение более чистое, поэтому я изменил его.