Задержка (Hmisc) с аргументом сдвига, определенным в другом столбце R

#r #dplyr #lag #hmisc

#r #dplyr #задержка #hmisc

Вопрос:

Чтобы упростить, я хотел бы, чтобы столбец C был равен запаздыванию столбца B, при этом аргумент сдвига зависит от целых чисел в столбце A, поэтому я хочу:

    A | B | C  
   0 | 5 | 5 
   2 | 6 | NA 
   3 | 7 | NA 
   2 | 8 | 6
  

Я попытался:

 library(dplyr)
library(Hmisc)
data <- mutate(data, 
    C= Lag(B, shift=as.integer(A)),
  

но это не работает, я получаю только NAs, вероятно, это проблема типа, но
я не уверен, так как даже с as.integer это не работает, у
кого-нибудь есть идеи, почему это не работает?

Большое спасибо

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

1. вы уверены, что ваш вывод правильный? Я думаю, что это должно быть 5, NA, NA, 6 Try diag(sapply(df$A, function(i) lag(df$B, i)))

2. О да, я допустил ошибку, спасибо!

Ответ №1:

lag from dplyr также имеет аргумент shift, поэтому нет необходимости загружать другой пакет. Одним из способов сделать это было бы,

 library(dplyr)
df$C <- diag(sapply(df$A, function(i) lag(df$B, i)))
df
#  A B  C
#1 0 5  5
#2 2 6 NA
#3 3 7 NA
#4 2 8  6
  

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

1. Я получаю сообщение об ошибке «n должно быть единственным положительным целым числом», даже когда я добавляю as.integer перед тем, как я

2. есть ли у вас какие-либо отрицательные целые числа в df$A ? Можете ли вы поделиться str(data) ?

3. Все это num, но да, у меня есть отрицательные целые числа в df $ A, причем отрицательные целые числа Lag (Hmisc) принимают прямые значения вместо значений до! И нули, похоже, тоже проблема, когда у меня нет отрицательных значений, но у меня есть нули, я получаю сообщение об ошибке: Ошибка в if (n == 0) return(x): пропущенное значение, где требуется TRUE / FALSE

4. Как вы хотите их обработать? Было бы нормально, если бы вы преобразовали отрицательные значения в положительные? (т. Е. diag(sapply(abs(df$A), function(i) lag(df$B, i))) Что касается 0, похоже, он работает в примере, которым вы поделились.

5. Мне нужно принять прямые значения, чтобы я не мог преобразовать отрицательное значение в положительное, возможно, мне нужно найти что-то еще, кроме задержки

Ответ №2:

Решение: Аргумент shift, похоже, не принимает значения столбца в виде целых чисел, поэтому я сделал это по-другому:

 df$C <- apply(as.data.frame(df$A), 1, function(i){ 
    nth(df$B, i) 
})
  

Он принимает n-е значение B, при этом n находится в столбце A

(Большое спасибо за помощь мне в Sotos)