R-применить и удалить столбцы


У меня есть data.frame под названием dt, который выглядит так:

row.names     A     B     C     D
        1   0.1   0.2   0.5   0.3
        2   0.2   0.3   0.4     0
        3    10  -0.1  -0.3   0.3 # remove A cause 10 / 0.2 > 2

И я хочу удалить столбцы такие, что для столбца X, Если X[i]/X[i-1]>2,i>=2. т. е. если текущая строка, разделенная на предыдущую строку, больше 2 (двукратное увеличение), удалите столбец.

Я пробовал apply Вот так:

temp<-dt
val<-apply(temp,2,function(y) {
  y<-na.omit(y) # omit na
  ans1 <- y[-1,] / y[-nrow(y),] - 1 # divide previous row
  if (max(ans1,na.rm=TRUE)>2) {
    y<-NULL # remove from temp
  }
})
Но это, кажется, не удаляет строку из temp. Я подумал о том, чтобы, возможно, вернуть список colnames, но я не могу получить их изнутри apply так, как я сделал оно.

Есть идеи?

Спасибо.

= = = EDIT = = =
Выяснил это с помощью модифицированной версии ответа лукеи:

val<-sapply(dt,function(y) {
  y2<-na.omit(y) # omit NA
  ans1 <- y2[-1] / y2[-length(y2)] - 1 # divide previous row
  if (max(ans1,na.rm=TRUE)>1.5|min(ans1,na.rm=TRUE)< -0.5) {
    return(NULL) # return all NULL
  } else {
    return(y) # return original
  }
})
1 2

1 ответ:

Это преобразует ваши значения A в NA (недоступно):

dt$A[-1] <- ifelse(dt$A[-1] / head(dt$A[-1], -1) > 2, NA, dt$A[-1])
Теперь вы можете решить, что делать с thoses NAs в вашем столбце A, например, удалить строки:
dt <- dt[!is.na(dt$A), ]

Это также будет работать для всех столбцов следующим образом:

dt[, -1] <- sapply(dt[, -1], function(x) {
  x[-1] <- ifelse(x[-1] / head(x[-1], -1) > 2, NA, x[-1])
  x
})
dt <- na.omit(dt) # remove NA rows

И если вы хотите удалить столбцы с помощью NA, Вы можете сделать это следующим образом:

dt[, c(1, which(!is.na(colSums(dt[, -1]))))]