【问题标题】:Reading and counting of consecutive points连续点的读取和计数
【发布时间】:2018-11-23 16:24:26
【问题描述】:

我在从 data.table 读取二维空间的坐标时遇到问题,如下所示:

DT <- data.table(
                                      A = c(rep("aa",2),rep("bb",2)),
                                      B = c(rep("H",2),rep("Na",2)),
                                      Low = c(0,3,1,1),
                                      High = c(8,10,9,8),
                                      Time =c("0,1,2,3,4,5,6,7,8,9,10","0,1,2,3,4,5,6,7,8,9,10","0,1,2,3,4,5,6,7,8,9,10","0,1,2,3,4,5,6,7,8,9,10"),
                                      Intensity = c("0,0,0,0,561464,0,0,0,0,0,0","0,0,0,6548,5464,5616,0,0,0,68716,0","5658,12,6548,6541,8,5646854,54565,56465,546,65,0","0,561464,0,0,0,0,0,0,0,0,0")

                     )

“时间”和“强度”列指的是 2D 空间的 x 和 y 值。 “低”和“高”列指的是 x 轴上的边界(“时间”)。 现在我想检查 () 那些边界内 y(“强度”)维度的不同质量:

  1. 连续点数最高>0:(row1: 1, row 2: 2,..)
  2. 总点数>0:(row1: 1, row2: 3,..)
  3. 连续点的最高数量>基线(基线值应取自低或高边界的强度值,以较低者为准(因此对于第 3 行,它将是 12,对于其他 0)):(第 3 行:4,对于所有其他行,与第 1 行相同。)

所以输出应该是这样的表格:

DT <- data.table(
                              A =c(rep("aa",2),rep("bb",2)),
                              B =c(rep("H",2),rep("Na",2)),
                              Low = c(0,3,1,1),
                              High = c(8,10,9,8),
                              Time = c("0,1,2,3,4,5,6,7,8,9,10","0,1,2,3,4,5,6,7,8,9,10","0,1,2,3,4,5,6,7,8,9,10","0,1,2,3,4,5,6,7,8,9,10"),
                              Intensity = c("0,0,0,0,561464,0,0,0,0,0,0","0,0,0,6548,5464,5616,0,0,0,68716,0","5658,12,6548,6541,8,5646854,54565,56465,546,65,0","0,561464,0,0,0,0,0,0,0,0,0"),
                              First = c(1,2,7,0),
                              Second= c(1,3,7,0),
                              Third = c(1,2,4,0)
                  )

有人知道如何处理这项任务吗?到目前为止,我一直在尝试使用 data.table,但如果有人知道更好的包来完成此类任务,我也会很高兴。

非常感谢您!

亚塞尔

【问题讨论】:

  • 一个建议 - 当您创建 data.frame 或 data.table 时,直接使用它而不是 as.data.frame(cbind,因为 cbind 返回一个矩阵,并且矩阵只能有一个类。在这种情况下,由于某些字符列,所有数字列都会转换为字符
  • 谢谢,已相应调整
  • 描述与预期输出不匹配。当你说highest number of consecutive points &gt; 0时,为什么第0行是1。是基于V6列还是V5
  • 请将所有的
  • 我编辑了你的数据集。对于data.table,默认stringsAsFactors = FALSE,同样赋值&lt;-应该是=里面

标签: r data.table


【解决方案1】:

这是base R 的一种方法。我们将split 'Intensity'、'Time' 列由, 转换成list,然后循环遍历list 的相应元素以及'High'、'Low' 列的元素,提取'Intensity'中的值基于从'Low'到'High'的索引,检查它是否大于0(并且还基于'Low'中值的条件检查)。使用rle 查找大于0(或“低”索引)的连续元素的length。用原始数据集创建data.framerbindlistcbind 的内容

newCols <- do.call(rbind, Map(function(u, v, x, y) {
     u1 <- as.numeric(u)
     v1 <- as.numeric(v)
     v2 <- as.numeric(v1[u1 >x & u1 < y])
     i1 <- with(rle(v2 > 0), pmax(max(lengths[values]), 0))
     i2 <- sum(v2 > 0)
     lb <- match(x, u1)
     ub <- match(y, u1)
     v3 <- as.numeric(v[(lb+1):(ub-1)])

     i3 = with(rle(v3 > min(as.numeric(v[c(lb, ub)]))), 
                      pmax(max(lengths[values]), 0))
      data.frame(First = i1, Second = i2, Third = i3)
      },
         strsplit(DT$Time, ","), strsplit(DT$Intensity, ","), DT$Low, DT$High))

cbind(DT, newCols)
#  A  B Low High                   Time                                        Intensity First Second Third
#1: aa  H   0    8 0,1,2,3,4,5,6,7,8,9,10                       0,0,0,0,561464,0,0,0,0,0,0     1      1     1
#2: aa  H   3   10 0,1,2,3,4,5,6,7,8,9,10               0,0,0,6548,5464,5616,0,0,0,68716,0     2      3     2
#3: bb Na   1    9 0,1,2,3,4,5,6,7,8,9,10 5658,12,6548,6541,8,5646854,54565,56465,546,65,0     7      7     4
#4: bb Na   1    8 0,1,2,3,4,5,6,7,8,9,10                       0,561464,0,0,0,0,0,0,0,0,0     0      0     0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2014-04-14
    • 2020-05-18
    • 2016-06-26
    • 1970-01-01
    • 2015-10-07
    • 2018-10-23
    相关资源
    最近更新 更多