使用 R 和 dplyr 扩展和离散化时间序列数据
Expanding and discretizing time series data with R and dplyr
我有一个实验数据。我们为人类决策计时。我们有一组备选方案(我们称它们为 A、B、C、D),可以在 30 秒内重复选择,我们为第一个、第二个、第 N 个选择计时(受试者可能会改变主意)。数据如下所示(时间以毫秒为单位):
subject time choice
1 2204 A
1 3673 B
1 8435 C
1 12640 B
1 24031 A
我想对数据进行离散化和扩展,以便能够得到每一秒选择的选项;每次(还)没有选择时默认为 0。理想情况下,它看起来像这样
subject second choice
1 1 0
1 2 0
1 3 A
1 4 B
1 5 B
1 6 B
1 7 B
1 8 B
1 9 C
1 10 C
1 11 C
1 12 C
1 13 B
...以此类推直到秒 = 30。
非常欢迎基于 tidyverse 包和 dplyr 管道的解决方案。但我对其他解决方案持开放态度。谢谢!
library(dplyr)
library(tidyr)
library(zoo)
df %>%
mutate(time=ceiling(time/1000)) %>%
complete(subject, time=1:30) %>%
group_by(subject) %>%
mutate(choice = na.locf(choice, na.rm = FALSE))
数据
df = structure(list(subject = c(1L, 1L, 1L, 1L, 1L), time = c(2204L,
3673L, 8435L, 12640L, 24031L), choice = c("A", "B", "C", "B",
"A")), .Names = c("subject", "time", "choice"), class = "data.frame", row.names = c(NA,
-5L))
这是使用 Base R 方法...可能不像其他答案那么优雅
dt = fread("subject time choice
1 2204 A
1 3673 B
1 8435 C
1 12640 B
1 24031 A")
sec <- ceiling(dt$time/1000)
dt1 <- data.table( a = 1:30)
dt1$b <- cumsum(1:30 %in% sec)
x <- dt$choice[dt1$b]
dt1$ans <- c(rep(0, 30-length(x)), x)
dt1
a b ans
1: 1 0 0
2: 2 0 0
3: 3 1 A
4: 4 2 B
5: 5 2 B
.
.
.
17: 17 4 B
18: 18 4 B
19: 19 4 B
20: 20 4 B
.
.
.
我有一个实验数据。我们为人类决策计时。我们有一组备选方案(我们称它们为 A、B、C、D),可以在 30 秒内重复选择,我们为第一个、第二个、第 N 个选择计时(受试者可能会改变主意)。数据如下所示(时间以毫秒为单位):
subject time choice
1 2204 A
1 3673 B
1 8435 C
1 12640 B
1 24031 A
我想对数据进行离散化和扩展,以便能够得到每一秒选择的选项;每次(还)没有选择时默认为 0。理想情况下,它看起来像这样
subject second choice
1 1 0
1 2 0
1 3 A
1 4 B
1 5 B
1 6 B
1 7 B
1 8 B
1 9 C
1 10 C
1 11 C
1 12 C
1 13 B
...以此类推直到秒 = 30。
非常欢迎基于 tidyverse 包和 dplyr 管道的解决方案。但我对其他解决方案持开放态度。谢谢!
library(dplyr)
library(tidyr)
library(zoo)
df %>%
mutate(time=ceiling(time/1000)) %>%
complete(subject, time=1:30) %>%
group_by(subject) %>%
mutate(choice = na.locf(choice, na.rm = FALSE))
数据
df = structure(list(subject = c(1L, 1L, 1L, 1L, 1L), time = c(2204L,
3673L, 8435L, 12640L, 24031L), choice = c("A", "B", "C", "B",
"A")), .Names = c("subject", "time", "choice"), class = "data.frame", row.names = c(NA,
-5L))
这是使用 Base R 方法...可能不像其他答案那么优雅
dt = fread("subject time choice
1 2204 A
1 3673 B
1 8435 C
1 12640 B
1 24031 A")
sec <- ceiling(dt$time/1000)
dt1 <- data.table( a = 1:30)
dt1$b <- cumsum(1:30 %in% sec)
x <- dt$choice[dt1$b]
dt1$ans <- c(rep(0, 30-length(x)), x)
dt1
a b ans
1: 1 0 0
2: 2 0 0
3: 3 1 A
4: 4 2 B
5: 5 2 B
.
.
.
17: 17 4 B
18: 18 4 B
19: 19 4 B
20: 20 4 B
.
.
.