gpt4 book ai didi

r - R 中随时间变化的数据操作

转载 作者:行者123 更新时间:2023-12-02 04:23:06 24 4
gpt4 key购买 nike

基于下面的 R data.frame,我正在寻找一种优雅的解决方案来计算不同时间组之间转换的人数。

dat <- data.frame(people = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4),
time = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),
group = c(5,4,4,3,2,4,4,3,2,1,5,5,4,4,4,3,3,2,2,1))

我想要一个通用的解决方案,因为我的问题规模要大得多。我正在考虑使用 mutate 的东西可以做到这一点,但我不确定从哪里开始

我正在寻找的输出开始的示例是这样的:

dat_result <- data.frame(time_start = c(1,1,1,1,1),
time_end = c(2,2,2,2,2),
group_start = c(1,1,1,1,1),
group_end = c(1,2,3,4,5),
count = "")

这将对所有时间转换和所有组转换重复。时间当然是线性的,所以 1 只能去 2 和 2 去 3,等等。但是,任何组都可以转换到任何其他组,包括在两次之间留在同一组。

最佳答案

我正在使用包 data.table 因为它可以很容易地按组工作。可以使用 dplyr 执行相同的步骤,但我不熟悉它。

library(data.table)

# Convert to data.table:
setDT(dat)

# Make sure your data is ordered by people and time:
setorder(dat, people, time)

# Create a new column with the next group
dat[, next.group := shift(group, -1), by = people]

# Remove rows where there's no change:
# (since this will remove data, you may want to atributte to a new object)
new <- dat[group != next.group]

# Add end.time:
new[, end.time := shift(time, -1, max(dat$time)), by = people]

# Count the ocurrences (and order the result):
> new[, .N, by = .(time, end.time, group, next.group)][order(time, end.time, group)]
time end.time group next.group N
1: 1 3 5 4 1
2: 2 3 4 3 1
3: 2 4 3 2 1
4: 2 5 5 4 1
5: 3 4 3 2 1
6: 3 4 4 3 1
7: 4 5 2 1 2
8: 4 5 3 2 1

关于r - R 中随时间变化的数据操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57828497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com