当前位置: 首页 > 知识库问答 >
问题:

将序列中的值分配给一组连续的行,使某些行为空

南门欣怡
2023-03-14

我试图将几个连续的行分组(并赋予它们相同的值),同时将一些行留空(当不满足某个条件时)。

我的数据是位置(xy坐标)、测量日期/时间以及测量之间的时间跨度。有些简化,它们看起来是这样的:

ID   X     Y      Time    Span
1    3445  7671   0:00    -
2    3312  7677   4:00    4
3    3309  7680   12:00   8
4    3299  7681   16:00   4
5    3243  7655   20:00   4
6    3222  7612   4:00    8
7    3260  7633   0:00    4
8    3254  7641   8:00    8
9    3230  7612   0:00    16
10   3203  7656   4:00    4
11   3202  7678   8:00    4
12   3159  7609   20:00   12
...

我想为在4小时内测量的每个位置序列分配一个值,并使我的数据看起来像这样:

ID   X     Y      Time    Span  Sequence
1    3445  7671   0:00    -     -
2    3312  7677   4:00    4     1
3    3309  7680   12:00   8     NA
4    3299  7681   16:00   4     2
5    3243  7655   20:00   4     2
6    3222  7612   4:00    8     NA
7    3260  7633   0:00    4     3
8    3254  7641   8:00    8     NA
9    3230  7612   0:00    16    NA
10   3203  7656   4:00    4     4
11   3202  7678   8:00    4     4
12   3159  7609   20:00   12    NA

我尝试了几种带有循环“for”加上“ifelse”条件的算法,例如:

Sequence <- for (i in 1:max(ID)) {
ifelse (Span <= 4, i+1, "NA")
}

没有任何运气。我知道我的尝试是不正确的,但是我的编程技能非常基础,我在网络上没有发现任何类似的问题。

任何想法都将不胜感激!

共有3个答案

呼延原
2023-03-14
count = 0
for (i in 1:max(ID)) {
      Sequence[i] = ifelse(Span[i] <= 4, count <- count+1, NA)
}
罗昊空
2023-03-14

这是使用rlerep的另一种选择。我们将假设您的<code>数据。帧被命名为“test”。

首先,初始化“序列”列,用NA填充。

test$Sequence <- NA

其次,指定要匹配的条件,在本例中为 test$Span == 4

x <- test$Span == 4

第三,使用 rle 输出(长度)的组合来获取序列中每个新运行的发生次数。

spanSeq <- rle(x)$lengths[rle(x)$values == TRUE]

最后,使用 rep,并将 times 参数设置为在步骤 3 中获得的结果。根据 test$Span == 4 匹配的索引,对 test$Sequence 的所需值进行子集化,并将它们替换为新序列。

test$Sequence[x] <- rep(seq_along(spanSeq), times = spanSeq)
test
#    ID    X    Y  Time Span Sequence
# 1   1 3445 7671  0:00    -       NA
# 2   2 3312 7677  4:00    4        1
# 3   3 3309 7680 12:00    8       NA
# 4   4 3299 7681 16:00    4        2
# 5   5 3243 7655 20:00    4        2
# 6   6 3222 7612  4:00    8       NA
# 7   7 3260 7633  0:00    4        3
# 8   8 3254 7641  8:00    8       NA
# 9   9 3230 7612  0:00   16       NA
# 10 10 3203 7656  4:00    4        4
# 11 11 3202 7678  8:00    4        4
# 12 12 3159 7609 20:00   12       NA

一旦您了解了所涉及的步骤,您还可以直接使用within()来完成此操作。下面将给出相同的结果:

within(test, {
  Sequence <- NA
  spanSeq <- rle(Span == 4)$lengths[rle(Span == 4)$values == TRUE]
  Sequence[Span == 4] <- rep(seq_along(spanSeq), times = spanSeq)
  rm(spanSeq)
})
许高峻
2023-03-14

这是一个长长的一行:

ifelse(x <- DF$Span == 4, cumsum(c(head(x, 1), tail(x, -1) - head(x, -1) == 1)), NA)
# [1] NA  1 NA  2  2 NA  3 NA NA  4  4 NA

解释:

    < li> x是一个TRUE/FALSE向量,表示< code>Span是< code>4。 < li> tail(x,-1)是编写< code>x[2:length(x)]的一种安全方式 < li> head(x,-1)是编写< code > x[1:(length(x)-1)] 的一种安全方式 < li> tail(x,-1) - head(x,-1) == 1是一个真/假向量,表示我们从< code>Span!= 4到< code>Span == 4。 < li >由于上面的向量比< code>x短一个元素,所以我在它前面添加了< code>head(x,1)。< code>head(x,1)是编写< code>x[1]的一种安全方式。 < li >然后我取< code>cumsum,这样它就把向量TRUE/FALSE转换成一个递增整数的向量:其中< code>Span从< code >跳转!=4到< code>==4它增加1,否则保持不变。 < li >所有内容都包装在< code>ifelse中,因此您只能看到< code>x为真的数字,即< code>Span == 4。
 类似资料:
  • 我正在处理一个大的时间序列,其中一列包含四个不同的传感器,一列包含测量值。我需要为属于同一时间的测量分配一个 id。问题是,每个设备的测量时间略有不同,因此我不能简单地按时间戳对它们进行分组。在按时间排序的数据框中,应分组的测量值可以通过唯一设备 ID 序列进行识别。这里的问题是,一次 4 台设备记录一个值,另一次 3 台设备记录一个值。我的数据如下所示。 您可以通过以下方式复制: 我需要为连续的

  • 问题内容: 我正在尝试从SQLite表中提取数据,该表将键值对存储在双列中。例如,用钥匙,,,和,该表将如下所示: 我想执行一个查询,以行作为键,值作为行,每行都给我。像这样: 我唯一能想到的解决方案是每个键的联接: 有一个更好的方法吗? 问题答案: 另一个可用的选项是使用 条件聚合 :

  • 这是我拥有的数据帧的简化版本: 在这个 df 中,row.names 是唯一的 ID(我知道它打破了整洁数据的规则)。 在示例中,我们可以看到行id1和行id2是重复的。 我想做的是确定它们是重复的,并为这些重复项分配一个唯一的组名称。但请注意,将有多行彼此重复。 我希望的产出是: 有什么想法吗? 编辑: 我的原始数据示例:

  • 问题内容: 我正在使用MS SQL Server 2008,并且我想这样做: 要成为这个: 即,行由“事件”列“分组”。每个 分组的 相同“事件”中仅显示一个。 如果一个事件(例如ID为0的“ note”)在表中没有紧靠其前后(具有最近时间戳记的行)的行,且具有相等的“ event”值,则显示该事件; 如果同一事件有多个行,例如ID为1-3的“时间”。出现在彼此之后(即没有带有不同“事件”的行具有

  • 问题内容: 施玛 我在MySQL数据库中进行了以下设置: 问题 我需要选择: *具有该值的 *所有 项目都具有价值, 并且 *每个组中的 *一项以 最低的 价格确定。 预期成绩 可能的解决方案1: 两个查询 但是,不希望有两个查询,因为子句中的条件会更复杂,而且我需要对最终结果进行排序。 可能的解决方案2: 关于表达式(参考) 解决方案2似乎更快速,更易于使用,但是我想知道在性能方面是否有更好的方

  • 对于每个组A、B、C、D,每次组合y、z出现在组末尾时,我都想删除b列中的值z。 如果我们有 a==“C”的情况,其中 b 值是 y,z,z,z,z,我想删除所有 z。但是,在 a==“D” 中,由于 x 是最后一个值,因此无需更改任何内容。 结果如下所示: 通过在< code>dplyr中进行分组,我可以确定每个值在A中最后出现的位置,因此< code>a=="A"中描述的基本情况不成问题。对于