0

我当然希望我清楚地提出我的问题。所以,我试图在 R 中拆分某个 df。这是一个很大的 df,您可以在下面看到(缩短的)结构。

'data.frame':36993 obs。n 个变量:
$ klasse : num 1 1 1 1 1 1 1 1 1 1 ...
$ Start_time: chr "23:56:09.000" "23:56:09.000" "23:56:09.000" "23:56 :09.000" ...
$ Start_date: 日期,格式:"2013-08-31" "2013-08-31" "2013-08-31" "2013-08-31" ...
$ Milk : num 23.5 23.5 23.5 23.5 23.5 23.5 23.5 23.5 23.5 23.5 ...
$ duur_visit: 数量 1048 1048 1048 1048 1048 ...

现在,我要做的是将 df 拆分为 df$klasse 中 120 个观察值的一部分,其中包含 39 个不同长度的不同元素(例如 1 = 1048 obs,2 = 239 obs 等)。此外,我想对这些组进行编号,对于 df$klasse 的每个新元素,它们每次都从 1 开始。

我是一个菜鸟,我得到的最远的结果是发现我可能不得不使用包 stringr,但是,我不确定。或者使用函数split,结合lapply。关于拆分和分组变量的主题有很多信息,我迷路了。如果有人可以帮助我,或者在正确的方向上轻推我,我将不胜感激。

编辑

@shadow 的代码似乎在正确的方向上,但它在我的数据集“超出”120 个观察值的地方切断了我的数据集。所以,我将尝试举例说明我想要完成的事情:

> within df
klasse  grp   Start_time
1        1     2013-08-31 02:54:35.000
1        1     2013-08-31 02:54:35.000
1        2     2013-08-31 02:54:35.000
1        2     2013-08-31 02:54:35.000
1        3     2013-08-31 02:54:35.000
2        1     2013-08-31 08:36:13.000
2        1     2013-08-31 08:36:13.000
2        2     2013-08-31 08:36:13.000
2        2     2013-08-31 08:36:13.000
2        3     2013-08-31 08:36:13.000
2        3     2013-08-31 08:36:13.000
2        4     2013-08-31 08:36:13.000
3        1     2013-09-01 15:01:40.000
3        1     2013-09-01 15:01:40.000
4        1     2013-09-01 23:51:54.000

当然,我将其缩短为每组只有 2 个数字,否则它会变得很大,但实际上在组列中,我希望组的最大120 倍于数字 1、2 等。我希望我清除它一点?

编辑 2

是的,我今天早上再次运行它,@shadow 的解决方案运行良好!我不知道我昨天做错了什么。

4

2 回答 2

1

这是执行此操作的split方法lapply。如果df是你的data.frame,那么你可以使用 split 来得到一个listdata.frame按 klasse 分组:

lst <- split(df, df$klasse)
lst

然后,您可以使用lapply进一步拆分为您想要的观察数量:

nobs <- 120 # number of observations
l2 <- unlist(lapply(lst, function(x) {
  x$grp <- rep(1:(nrow(x)/nobs+1), each=nobs)[1:nrow(x)] # grouping 
  split(x, x$grp) # splitting
}), recursive=FALSE)

如果我误解了你的问题,你可能想用一个可重现的例子来更新它,你明确地给出了一些数据和预期的输出。

于 2013-10-28T15:36:45.367 回答
0

split 函数将允许您创建基于 klasse 分隔的数据帧列表。

myKlasse <- split(dfrm, dfrm$klasse)
myKlasse  <- lapply( myKlasse, function(df) {df$seqnum <- seq_along(rownames(df) )
                                             df }

`seq_along 将编号为数据帧的行。(您可能已经用行名编号,因为这是默认设置,但这也将使其成为数据框列。

于 2013-10-28T15:37:14.253 回答