所以我看了this和this,似乎找不到循环或迭代因子的方法的好例子(或者是他们的其他/更好的方法做这个?)。我有一个数据框,我有:
> head(frame)
x1 x2 DateTime
1 100 5 2010-06-01 05:32:46
2 105 3 2010-06-01 05:32:23
3 47 20 2010-06-01 05:32:34
4 56 6 2010-06-01 05:33:16
5 98 11 2010-06-01 05:54:12
6 84 9 2010-06-01 05:54:05
我可以根据时间创建一个因子:fact <- cut(frame$DateTime, "1 hour")
从那里开始,如果给出我创建的因子,我将如何提取帧$ x2的第一个和最后一个元素? (或者就此而言,切割的第n个元素)。
会是这样的:
test <- split(frame$x2, fact)
答案 0 :(得分:0)
我不确定你是什么意思“提取”第n个元素(即你想要它在同一个对象中,一个新对象,你想要的东西与原始对象的长度相同,等等。) / p>
我会使用ave
因为它对因子组起作用。请注意,这假设您的data.frame按frame$DateTime
排序。
frame <- structure(list(
x1 = c(100L, 105L, 47L, 56L, 98L, 84L),
x2 = c(5L, 3L, 20L, 6L, 11L, 9L),
DateTime = structure(c(1275388366, 1275388343, 1275388354, 1275388396,
1275389652, 1275389645), class = c("POSIXct", "POSIXt"), tzone = ""),
fact = structure(c(1L, 1L, 1L, 1L, 1L, 1L),
.Label = "2010-06-01 05:00:00", class = "factor")),
.Names = c("x1", "x2", "DateTime", "fact"),
row.names = c(NA, -6L), class = "data.frame")
transform(frame, firstx2=ave(x2, fact, FUN=function(x) x[1]),
lastx2 =ave(x2, fact, FUN=function(x) x[length(x)]))
# These lines do the same as the `transform` line(s)
frame$firstx2 <- ave(frame$x2, frame$fact, FUN=function(x) x[1])
frame$lastx2 <- ave(frame$x2, frame$fact, FUN=function(x) x[length(x)])