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 ответ:
Это преобразует ваши значения A в
NA
(недоступно):Теперь вы можете решить, что делать с thosesdt$A[-1] <- ifelse(dt$A[-1] / head(dt$A[-1], -1) > 2, NA, dt$A[-1])
NA
s в вашем столбце 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]))))]