【发布时间】:2014-03-12 00:09:47
【问题描述】:
我有一个名为 dt 的 data.frame,它看起来像:
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[i]/X[i-1]>2,i>=2,我想删除列X。
即如果当前行除以上一行大于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
}
})
【问题讨论】:
标签: r function matrix apply division