循环rep函数与不相等的组

时间:2014-11-09 15:55:10

标签: r

本网站上的第一次海报,但却是常客。

我有一个包含50只个体动物的数据集。每只动物有400-700个位置。我试图将每个人的8个连续步骤分开(例如,步骤1-8,9-16,17-24等)进行某些分析。所以我试图在数据框中添加一个新列,用于识别个人的步骤组(步骤1-8将是1,步骤9-16,将是2 ......),最终将与动物ID合并。

我正在尝试循环复制函数以获取此信息。像这样:

for (i in unique (pathdf$id)){
  n<-rep(1:700,each=8,length.out=348644)
  pathdf$newcolumn[i]<-n
}

不幸的是,个别群体的行号并不总是等于8.我尝试了不同的方法来解决问题,但无济于事。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

目前尚不清楚是否在每个locations内基于id进行排序后创建了这些步骤。如果是这种情况,首先对数据集进行排序,然后使用steps

创建ave
pathdf1 <- pathdf[with(pathdf, order(id, locations)),]
row.names(pathdf1) <- NULL
pathdf1 <- within(pathdf1, steps <- ave(id, id,
                FUN=function(x) (seq_along(x)-1)%/%8 +1))

或使用dplyr

library(dplyr)
pathdf2 <- pathdf1 %>% 
                  group_by(id) %>% 
                  mutate(steps1 =rep(1:ceiling(n()/8), each=8, 
                                               length.out=n()))

all.equal(pathdf2$steps, pathdf2$steps1)
#[1] TRUE

数据

set.seed(49)
pathdf <- data.frame(id=sample(1:20,20*40,replace=TRUE), 
                         locations=sample(20*40))