R - 应用和删除列

时间:2014-02-13 08:26:37

标签: r function matrix apply division

我有一个名为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
  }
})

1 个答案:

答案 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]))))]