2017-05-08 30 views
0

這裏我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,我需要通過Day(△t)的隨機量,具體爲每個組的每個組ID移位並且如果Day值從0

例如再次通過1500開始由5

這裏我的期望的輸出組101由第30天,通過100組300通過70,組270由1000,組100和組72:

 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移位每組必須是隨機的。

任何幫助將非常感激。

感謝

+0

不知道如果我得到它,但'data.table'你可以試試'setDT(DF),Day_new:=(日+ runif(uniqueN(ID),0,1500) )%% 1500,由= ID]'。 – nicola

+0

對不起,但它不工作,謝謝 – aaaaa

+0

我相信的訣竅是添加隨機數字每個組內的每個ID組 – aaaaa

回答

0
library(dplyr) 

set.seed(123) 

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

這將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 
+0

光滑作爲一個雞蛋,謝謝 – aaaaa

+0

對不起,但我得到負面的日值...爲什麼? – aaaaa

+0

你可以顯示給出負數的前後值嗎?在'mutate'中,如果刪除代碼的最後一行,則可以使新變量具有不同的名稱(如'Day2'),以幫助您排除 – Craig