【问题标题】:Shift rows by group by random generated delta t通过随机生成的增量 t 按组移动行
【发布时间】:2017-05-08 16:01:04
【问题描述】:

这是我的 data.frame 的示例:

df = read.table(text = 'ID Day
101 0
101 0
101 1
300 40
300 40
270 32
270 35
100 1450
100 1450
100 1451
72 1490
72 1499', header = TRUE)

假设每个Day obs 代表一个真实日期,并且时间段范围从Day = 0 到Day = 1500,我需要将每个ID 组随机移动Day (delta t),特定于每个组,如果 Day 值超过 1500,则从 0 重新开始。

例如第 101 组 30 天,第 300 组 70 天,第 270 组 1000 天,第 100 组 100 天,第 72 组 5 天

这是我想要的输出:

     ID Day
    101 30
    101 30
    101 31
    300 110
    300 110
    270 1032
    270 1035
    100 1550
    100 1550
    100 1551
    72 1495
    72 3

请注意,每组Day 的变化必须是随机的。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 不确定我是否明白了,但使用data.table 你可以试试setDT(df)[,Day_new:=(Day+runif(uniqueN(ID),0,1500))%%1500,by=ID]
  • 对不起,它不起作用,谢谢
  • 我相信诀窍是将随机数添加到每组 ID 中的每一天

标签: r random dataframe rows shift


【解决方案1】:

这将为每天添加一个 0 到 1000 之间的随机整数 - 您可以根据需要调整 sample 的范围。

library(dplyr)

set.seed(123)

df2 <- df %>%
  group_by(ID) %>%
  mutate(Day = (Day + sample(1:1000, 1)) %% 1500)

df2      
# ID   Day
# 101   409
# 101   409
# 101   410
# 300   981
# 300   981
# 270   916
# 270   919
# 100   739
# 100   739
# 100   740
# 72   278
# 72   287

【讨论】:

  • 抱歉,我的 Day 值为负数...为什么?
  • 你能显示给出负数的前后值吗?在mutate 中,您可以将新变量命名为不同的名称(例如Day2),这可能有助于您进行故障排除
  • 如果你删除了代码的最后一行 Day = replace(Day, Day > 1500, Day - 1500) 就可以了
  • 我认为mutate(Day = (Day + sample(1:1000, 1))%%1500) 会起作用。
  • @user2100721 它有效。如果您发布完整的答案,我会将其标记为正确。再次感谢两位。
【解决方案2】:
library(dplyr)

set.seed(123)

df2 <- df %>%
  group_by(ID) %>%
  mutate(Day = (Day + sample(1:1000, 1)) %% 1500)

【讨论】:

    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2021-12-25
    相关资源
    最近更新 更多