Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-应用和删除列_R_Function_Matrix_Apply_Division - Fatal编程技术网

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
和更大的矩阵)。@Ubobo
dt[,-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]))))]