减少R长度中的行序列

时间:2014-07-26 14:41:29

标签: r data.table


我正在寻找一种很好的方法来计算R中data.table(包版本1.9.2)中连续减少的最长次数。我非常失落,并且非常感谢任何帮助。对于我想要做的示例,减少是指值小于或等于先前值(< =)。

以下是我正在处理的数据的玩具样本。到目前为止,我已经放下了我最好的尝试,说实话,这是非常错误的,它返回了一个错误。我的尝试也使用2 for循环,我不是非常热衷于,因为我被告知应用循环更经常在R中使用。我已经尝试搜索此网站和网络的类似解决方案,但没有任何运气。我在完整数据表中实际拥有的行数刚刚超过100万,而我拥有的列数是17.

library(data.table)

TEST_DF <- data.table(COL_1 = c(5,2,3,1), COL_2 = c(1,0,4,2), 
                      COL_3 = c(0,1,6,3), COL_4 = c(0,0,0,4))

TEST_DF$COUNT <- as.numeric(0)

for( i in 1:NROW(TEST_DF))
{
  for (j in 1:(NCOL(TEST_DF) - 1))
  {
    TEST_DF$COUNT[j] <- if (TEST_DF[i, j, with = FALSE] >= 
                            TEST_DF[i, j + 1, with = FALSE])
                        {
                            TEST_DF$COUNT[j] + 2
                        }
  }
}

DESIRED <- data.table(COL_1 = c(5,2,3,1), COL_2 = c(1,0,4,2), 
                      COL_3 = c(0,1,6,3), COL_4 = c(0,0,0,4),
                      COUNT = c(4,2,1,0))

所需的输出显示在代码的底部。由于4个“COL”列出现在最长的缩减序列中,因此第一行的COUNT列将获得值4.在第二行中,前两列减少,后两列减少但没有减少之间的COUNT将得到2的值。在最后一列中,从COL_3减少到COL_4,因此COUNT将为此行获取值2。在没有减少的任何行中,例如最后一行,COUNT的值为0.

如果需要进一步澄清或提供信息,请与我们联系。

提前非常感谢你。

2 个答案:

答案 0 :(得分:1)

您可以使用函数diff()rle()来构建一个函数来提取运行长度。然后在数据行中使用apply()

foo <- function(x) {
  runs <- rle(c(x[2] <= x[1], diff(x) <= 0))
  if(all(runs$value == 0)) 0 else max(runs$lengths[runs$value == 1])
}

apply(TEST_DF, 1, foo)

[1] 4 2 1 0

答案 1 :(得分:0)

我使用了一个四循环来完成你正在寻找的东西。 apply对每一行起作用,for循环比较连续的列。

COUNT <- rep(0,4)
for (i in 1:(ncol(TEST_DF)-1)) {
  COUNT<-COUNT+apply(TEST_DF,1,function(x) ifelse(x[i]>=x[i+1],1,0))
}

这产生:3,2,1,0,因为第一行有3个减少。最后一列无法比较,因此只能进行三次比较。我不确定你为什么要4岁?

如果您希望数量成为原始表格的一部分:

TEST_DF$COUNT<-COUNT