使用函数rle()时出错

时间:2018-04-18 08:42:37

标签: r dataframe duplicates

我在R中有一个名为pxlast的数据帧,例如访问我使用pxlast [[5]]的5列。

[1] 259.55 259.55 265.21 269.40 278.23 283.63 288.51 289.84 284.83 280.51 289.76 289.38 294.10  -1.00  -1.00  -1.00
 [17] 300.30 303.86 311.65 303.29 296.44 295.13 297.22 294.60 299.65 290.23 295.80  -1.00  -1.00  -1.00 298.56 299.25
 [33] 287.37 290.06 281.71 287.66 290.16 280.31 281.51 293.69 292.25 293.73 294.60 291.36 283.81 288.65 288.29  -1.00
 [49]  -1.00  -1.00 293.25 293.54 277.41 268.08 267.01 270.63 267.25 254.73 266.59 266.73 278.34 282.03 289.63 282.40
 [65] 289.59 289.54 291.31 290.85 295.60 290.72 288.25 288.00 293.98 297.11 290.00 278.35 270.61 274.89 267.80 276.32
 [81] 279.05 289.07 285.87 293.36 293.18 294.76 295.77 296.35 290.23 297.61 296.93 293.31 290.06 289.98 287.29 282.07
 [97] 275.89 270.92 273.68 270.85 280.05 279.64 284.83 288.91 294.85 296.91 297.94 301.66 303.05 298.72 303.46 298.22
[113] 304.92 309.59 316.07 318.05 318.86 318.09 317.84 318.04 337.08 346.89 345.36 350.96 354.65 361.06 354.53 352.63
[129] 352.83 351.45 351.38 361.47 365.13 367.11 371.42 364.37 368.83 372.12 375.10 381.97 384.47 388.67 388.61 386.73
[145] 392.16 388.55 383.86 389.50 379.83 381.37 392.27 387.79 388.61 388.01 394.23 401.78 414.70 421.23 427.77 436.23
[161] 423.86 398.80 419.00 413.60 400.77 416.78 412.58 405.90 404.30 405.65     NA

正如您所看到的,有重复值,例如-1值。

我想返回重复次数超过X次的值和索引,例如重复次数超过3次的值。

这是我的代码。

runs = rle(pxlast[[5]])
pxlast[[5]][runs$lengths > 2]

结果是:

[1] 294.10 299.65 294.60

此结果应该是我向量中的第一个重复元素,因为您可以看到值不正确。

为什么?

我一直在测试并且rle函数正在返回我的运行变量如下。

[1] 2 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [59] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[117] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

正如您可以看到值相同的函数组,例如,出现的第一个“2值”意味着2个第一个数字是相同的,也就是说,如果数字是同样的,所以我不能在我的向量上使用它来返回我重复的值,因为它与indixes的总量不匹配。

如果它是以下面的方式,例如25个第一行,我可以使用它。

[1] 2 2 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

因为你保留了指数的总和。

有什么想法解决它?

2 个答案:

答案 0 :(得分:1)

这是一种可能的方式:

df<-data.frame(lengths=as.numeric(runs$lengths),values=as.numeric(runs$values))
df[df[,"lengths"]>2,]
   lengths values
13       3     -1
25       3     -1
43       3     -1

答案 1 :(得分:1)

如果我们需要根据rle索引

提取值
runs <- within.list(rle(pxlast[[5]]),  {
                 i1 <- lengths > 2
                 values <- values[i1]
                 lengths <- lengths[i1]})

inverse.rle(runs)

使用可重现的例子

v1 <- c(2, 2, 1, 3, 3, 3, 2, 4, 4, 4, 5)
runs <- within.list(rle(v1),  {i1 <- lengths > 2
                 values <- values[i1]
               lengths <- lengths[i1]})
inverse.rle(runs)
#[1] 3 3 3 4 4 4