R:检查列值是否减少/增加

时间:2015-08-13 04:02:02

标签: r

> dput(subset)
structure(list(MEMORY1 = c(1L, 1L, 1L, 1L, 2L), MEMORY2 = c(1L, 
1L, 1L, 1L, 1L), MEMORY3 = c(1L, 2L, 1L, 1L, 1L), MEMORY4 = c(2L, 
2L, 2L, 2L, 2L), MEMORY5 = c(1L, 2L, 1L, 2L, 1L), MEMORY6 = c(1L, 
1L, 2L, 1L, 2L), MEMORY7 = c(2L, 2L, 2L, 2L, 1L), MEMORY8 = c(1L, 
1L, 1L, 1L, 1L)), .Names = c("MEMORY1", "MEMORY2", "MEMORY3", 
"MEMORY4", "MEMORY5", "MEMORY6", "MEMORY7", "MEMORY8"), row.names = c(NA, 
-5L), class = "data.frame")

> subset
  MEMORY1 MEMORY2 MEMORY3 MEMORY4 MEMORY5 MEMORY6 MEMORY7 MEMORY8
1       1       1       1       2       1       1       2       1
2       1       1       2       2       2       1       2       1
3       1       1       1       2       1       2       2       1
4       1       1       1       2       2       1       2       1
5       2       1       1       2       1       2       1       1

reversion = vector()
#initialize vector
for(i in 1:ncol(subset)){
   if(all(diff(subset[[index]]) < 0)){
      ... #append column number to reversion
   }else reversion = reversion
}

对于subset中的每一列,我想检查是否存在反转(即,当我向下移动行时,值会减小)。因此,例如,MEMORY1没有反转,MEMORY2也没有。但MEMORY3确实如此。我试图编写一个输出向量reversion的循环,该向量包含具有反转的列的列号。在这种情况下,我希望我的reversion向量包含3 5 6 7,因为这些是带有转换的列。

1 个答案:

答案 0 :(得分:3)

diff函数返回向量中连续元素对之间的差异,您可以检查这些值中的任何一个是否为any为负数。剩下的就是将其应用于sapply数据框的列,并使用which获取指定的列号。

您可以将所有这些组合成一行,以获取所需的列号:

which(sapply(subset, function(x) any(diff(x) < 0)))
# MEMORY3 MEMORY5 MEMORY6 MEMORY7 
#       3       5       6       7

如果您想要未命名的向量,可以使用unname

unname(which(sapply(subset, function(x) any(diff(x) < 0))))
# [1] 3 5 6 7

请注意,我通过计算每列是否符合标准的逻辑向量,然后在该向量上使用which,避免在循环中追加匹配索引。通常,这将使您的代码更清晰,并可以帮助您避免一次一个地生成对象的一些低效率(有关详细信息,请查看the R inferno的第二个圆圈。)