迭代提取特定元素的因子

时间:2011-03-10 14:47:08

标签: r

所以我看了thisthis,似乎找不到循环或迭代因子的方法的好例子(或者是他们的其他/更好的方法做这个?)。我有一个数据框,我有:

> 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)

1 个答案:

答案 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)])