我有一个名为data.frame
的{{1}},如下所示:
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
。
即如果当前行除以前一行大于2(增加两倍),则删除该列。
我已经尝试过X[i]/X[i-1]>2,i>=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
中获取它们。
有什么想法吗?
感谢。
===编辑===
用lukeA答案的修改版本计算出来:
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
}
})
答案 0 :(得分:1)
这会将您的A值转换为NA
(不可用):
dt$A[-1] <- ifelse(dt$A[-1] / head(dt$A[-1], -1) > 2, NA, dt$A[-1])
现在,您可以决定如何处理A列中的NA
个问题,例如:删除行:
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]))))]