R-应用和删除列
我有一个名为R-应用和删除列,r,function,matrix,apply,division,R,Function,Matrix,Apply,Division,我有一个名为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,如果X[I]/X[I-1]>2,I>=2。 i、 e.如果当前行除以前一行大于2(
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
,如果X[I]/X[I-1]>2,I>=2
。
i、 e.如果当前行除以前一行大于2(增加两倍),则删除该列
我曾经尝试过这样的应用:
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
}
})
这将把A值转换为NA(不可用):
这也适用于所有列,如下所示:
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
dt[, c(1, which(!is.na(colSums(dt[, -1]))))]
感谢您的回复,有没有办法像在应用
中那样对每一列都这样做?矩阵dt
只是一个小例子,我会为一个非常大的矩阵(想想300x300
和更大的矩阵)。@Ubobodt[,-1]
表示除第一列以外的每一列,所以:是的。但是,ifelse
不是最快的<另一方面,code>colSums
是超高速的。试试看。谢谢,我正在编辑我的评论,但它超时了:哦!我尝试了使用dt[,-1]
的方法,但是我得到了错误50:x[-1]/head(x[-1],-1):较长的对象长度不是较短对象长度的倍数。结果dt
为空。@Ubobo我无法用您的示例数据重现错误。您的数据中是否已存在NA
s?不用担心,我已将其与您的修改数据一起使用:),请参见操作编辑。谢谢你,巴德。
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
dt[, c(1, which(!is.na(colSums(dt[, -1]))))]