如何向data.frame添加新的时间序列?

时间:2018-02-08 23:15:28

标签: r dataframe

我有一个长度未知的data.frame,并为不同的人(id)录制了SkinTemp。我想为每个id创建一个带有时间戳(1 / 32s)的向量。我不知道每个录音有多长。

getFExpr :: IO FProp
getFExpr = do
  putStrLn "Enter an FProp expression:"
  str <- getLine
  case reads str of
    (x, ""):_ -> return x
    _         -> putStrLn "\nInvalid expression!\n" >> getFExpr

main :: IO ()
main = do
  fprop <- getFExpr
  putStrLn "Your expression was:"
  print fprop

修改

通过调整此答案Numbering rows within groups in a data frame

,我已经研究了如何使用rle
df<-data.frame(
               SkinTemp=rnorm(65,37,0.5),
               id=rep(1:10,c(5,4,10,6,7,8,9,8,4,4)))

编辑2:

我已经意识到这不起作用,因为它从1/32而不是0开始。使用(row_number -1)/ 32的dplyr答案效果更好。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,时间戳是1 / 32,2 / 32,3 / 32 ... n / 32,其中n是每个ID 行的行数

因此,使用dplyr按ID进行分组应该有效:

编辑:现在使用(row_number() - 1)从0开始。

library(dplyr)
set.seed(123)
df1 <- data.frame(SkinTemp = rnorm(65, 37, 0.5),
                  id = rep(1:10, c(5, 4, 10, 6, 7, 8, 9, 8, 4, 4)))

df1 <- df1 %>% 
  group_by(id) %>% 
  mutate(ts = (row_number() - 1) / 32) %>%
  ungroup()

# A tibble: 65 x 3
   SkinTemp    id     ts
      <dbl> <int>  <dbl>
 1     36.7     1 0     
 2     36.9     1 0.0312
 3     37.8     1 0.0625
 4     37.0     1 0.0938
 5     37.1     1 0.125 
 6     37.9     2 0     
 7     37.2     2 0.0312
 8     36.4     2 0.0625
 9     36.7     2 0.0938
10     36.8     3 0    # ... with 55 more rows