У меня есть новая проблема с этими данными. Поскольку мои полные данные имеют вид, как этогоОбратитесь к предыдущей строке в data.table в R, с условием
a=data.table(A=c(1:10),B=c(1,2,0,2,0,0,3,4,0,2),C=c(2,3,1,4,5,3,6,7,2,2),D=c(1,1,1,1,1,2,2,2,2,2))
# A B C D
# 1: 1 1 2 1
# 2: 2 2 3 1
# 3: 3 0 1 1
# 4: 4 2 4 1
# 5: 5 0 5 1
# 6: 6 0 3 2
# 7: 7 3 6 2
# 8: 8 4 7 2
# 9: 9 0 2 2
#10: 10 2 2 2
Теперь я хочу, чтобы создать новый столбец, который вычисляет количество значений кратны с B/C из шкафа предыдущего ряда, до тех пор, как Б а не 0. Например, в строке 2 я могу рассчитать D = 2 * (1/2). Однако в строке 4 она должна быть 4 * (2/3), она не может быть 4 * (0/1). Я использую
a[, D:= {i1 <- (NA^!B)
list(A*shift(na.locf(i1*B))/shift(na.locf(i1*C)))},by=d]
, как Akrun вчера рекомендовал. Он не работает, когда я рассчитываю его по группе. Результат такой:
A B C d D
# 1: 1 1 2 1 NA
# 2: 2 2 3 1 1.000000
# 3: 3 0 1 1 2.000000
# 4: 4 2 4 1 2.666667
# 5: 5 0 5 1 2.500000
# 6: 6 0 3 2 NA
# 7: 7 3 6 2 3.500000
# 8: 8 4 7 2 4.571429
# 9: 9 0 2 2 5.142857
# 10: 10 2 2 2 NA
Кто-нибудь знает, в чем проблема здесь? Ошибка - это длинная длина объекта не кратна короткой длине объекта.
Что бы выход для первого элемента D? – akrun
Выход для первого элемента D будет NA –