在 R 中使用 non-unique ID-numbers 创建循环而不是使用行号进行迭代
Creating a loop using non-unique ID-numbers in R instead of using rownumbers for the iteration
真的很难想出一个合适的标题,但希望这能解释我的问题所在:
假设我有一个数据集(或向量),其中一列是数字 Frame_ID 列,但它们不是唯一 ID。例如 Frame_ID = c( 2 , 2 ,2 , 3 , 3 , 3 , 4 , 4 , 5 , 5 , 5 , 6 , 6 , 6 , 7 , 7 , 8 , 8 , 8 , 9 , 10 , 10 , 10 , 11 等),这一直持续到 Frame_ID=159753,没有任何特定的模式或规则可以解释 Frame_ID 重复了多少次。现在我想在新列中每 30 Frame_IDs 添加一个相应的时间戳(每 30 Frame_IDs 1 秒),所以它最终看起来像这样:
Frame_ID
Timestamp
2
14:30:19
2
14:30:19
2
14:30:19
3
14:30:19
...
....
30
14:30:19
31
14:30:20
31
14:30:20
我创建了这个函数,但我相信除了在概念上没有真正起作用外,它还使用行号而不是 i 的实际 Frame_ID 值。我怎样才能解决它,以便它处理迭代的实际 Frame_ID 值和 i 而不是行号?希望这是有道理的。
提前致谢,非常感谢任何提示。
real_time <- c()
start = hms('14:30:19')
for (i in 0:159753) {
start <- data$Frame_ID[i:i+30]
real_time[i] <- start
i = i + 30
start = start + 1
print(real_time)
}
在这里使用循环听起来效率很低。这对你有用吗?
data %>%
mutate(Timestamp = as.character(hms('14:30:19') + floor(Frame_ID/30)))
df <- data.frame(Frame_ID = c(2,2,2,3,30,31,31,39,59,60,69))
df$grp <- floor(df$Frame_ID/30)
df$Timestamp <- as.POSIXct("2000/01/01 14:30:19") + df$grp
df
#> Frame_ID grp Timestamp
#> 1 2 0 2000-01-01 14:30:19
#> 2 2 0 2000-01-01 14:30:19
#> 3 2 0 2000-01-01 14:30:19
#> 4 3 0 2000-01-01 14:30:19
#> 5 30 1 2000-01-01 14:30:20
#> 6 31 1 2000-01-01 14:30:20
#> 7 31 1 2000-01-01 14:30:20
#> 8 39 1 2000-01-01 14:30:20
#> 9 59 1 2000-01-01 14:30:20
#> 10 60 2 2000-01-01 14:30:21
#> 11 69 2 2000-01-01 14:30:21
format(df$Timestamp, format = "%H:%M:%S")
#> [1] "14:30:19" "14:30:19" "14:30:19" "14:30:19" "14:30:20" "14:30:20"
#> [7] "14:30:20" "14:30:20" "14:30:21" "14:30:21" "14:30:21"
Created on 2021-10-13 by the reprex package (v2.0.1)
真的很难想出一个合适的标题,但希望这能解释我的问题所在:
假设我有一个数据集(或向量),其中一列是数字 Frame_ID 列,但它们不是唯一 ID。例如 Frame_ID = c( 2 , 2 ,2 , 3 , 3 , 3 , 4 , 4 , 5 , 5 , 5 , 6 , 6 , 6 , 7 , 7 , 8 , 8 , 8 , 9 , 10 , 10 , 10 , 11 等),这一直持续到 Frame_ID=159753,没有任何特定的模式或规则可以解释 Frame_ID 重复了多少次。现在我想在新列中每 30 Frame_IDs 添加一个相应的时间戳(每 30 Frame_IDs 1 秒),所以它最终看起来像这样:
Frame_ID | Timestamp |
---|---|
2 | 14:30:19 |
2 | 14:30:19 |
2 | 14:30:19 |
3 | 14:30:19 |
... | .... |
30 | 14:30:19 |
31 | 14:30:20 |
31 | 14:30:20 |
我创建了这个函数,但我相信除了在概念上没有真正起作用外,它还使用行号而不是 i 的实际 Frame_ID 值。我怎样才能解决它,以便它处理迭代的实际 Frame_ID 值和 i 而不是行号?希望这是有道理的。
提前致谢,非常感谢任何提示。
real_time <- c()
start = hms('14:30:19')
for (i in 0:159753) {
start <- data$Frame_ID[i:i+30]
real_time[i] <- start
i = i + 30
start = start + 1
print(real_time)
}
在这里使用循环听起来效率很低。这对你有用吗?
data %>%
mutate(Timestamp = as.character(hms('14:30:19') + floor(Frame_ID/30)))
df <- data.frame(Frame_ID = c(2,2,2,3,30,31,31,39,59,60,69))
df$grp <- floor(df$Frame_ID/30)
df$Timestamp <- as.POSIXct("2000/01/01 14:30:19") + df$grp
df
#> Frame_ID grp Timestamp
#> 1 2 0 2000-01-01 14:30:19
#> 2 2 0 2000-01-01 14:30:19
#> 3 2 0 2000-01-01 14:30:19
#> 4 3 0 2000-01-01 14:30:19
#> 5 30 1 2000-01-01 14:30:20
#> 6 31 1 2000-01-01 14:30:20
#> 7 31 1 2000-01-01 14:30:20
#> 8 39 1 2000-01-01 14:30:20
#> 9 59 1 2000-01-01 14:30:20
#> 10 60 2 2000-01-01 14:30:21
#> 11 69 2 2000-01-01 14:30:21
format(df$Timestamp, format = "%H:%M:%S")
#> [1] "14:30:19" "14:30:19" "14:30:19" "14:30:19" "14:30:20" "14:30:20"
#> [7] "14:30:20" "14:30:20" "14:30:21" "14:30:21" "14:30:21"
Created on 2021-10-13 by the reprex package (v2.0.1)