> 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
,因为这些是带有转换的列。
答案 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的第二个圆圈。)