根据应用于R中每行的if条件从矩阵中提取行

时间:2013-12-04 10:30:54

标签: r lubridate

你能帮我弄清楚为什么以下不起作用吗?我有一个2528x3的矩阵uniqueitems,看起来像这样:

Number        Created               Customer
===========   ===================   ============
31464686486   2013-10-25 10:00:00   john@john.de
...

我想做的事:遍历每一行,检查Created是否比给定时间更新,如果是,则将行写入新表中。这是我的代码:

library(lubridate);
newerthan <- function(x) {
  times <- ymd_hms(uniqueitems[,2])
  newerthantable <- matrix(data=NA,ncol=3,nrow=1)
  i <- 1;
  while (i <= nrow(uniqueitems)) {
    if (x < times[i]) {
      newerthantable <- rbind(newerthantable,uniqueitems[i,])
    }
    i <- i + 1;
  }
}

但是newerthan(“2013-10-24 14:00:00”)没有达到预期的效果:(,没有任何内容写在newerthantable。为什么?

1 个答案:

答案 0 :(得分:0)

很少需要R循环。您可以使用矢量化操作或子集化来获得相同的结果。

设置样本数据框:

number <- c(1:10)
created <- seq(as.POSIXct("2013-01-01 10:01"), length.out=10, by="26 hours")
customer <- letters[c(1:10)]
df <- data.frame(number, created, customer)

head(df, 10)

   number             created customer
1       1 2013-01-01 10:01:00        a
2       2 2013-01-02 12:01:00        b
3       3 2013-01-03 14:01:00        c
4       4 2013-01-04 16:01:00        d
5       5 2013-01-05 18:01:00        e
6       6 2013-01-06 20:01:00        f
7       7 2013-01-07 22:01:00        g
8       8 2013-01-09 00:01:00        h
9       9 2013-01-10 02:01:00        i
10     10 2013-01-11 04:01:00        j

选择比给定日期更新的行:

newerthantable <- df[df$created > as.POSIXct("2013-01-05 18:01:00"), ]

head(newerthantable,10)

   number             created customer
6       6 2013-01-06 20:01:00        f
7       7 2013-01-07 22:01:00        g
8       8 2013-01-09 00:01:00        h
9       9 2013-01-10 02:01:00        i
10     10 2013-01-11 04:01:00        j

方括号选择符合我们条件的行(created列大于给定日期)和所有列(逗号后没有列规范)。在此处阅读有关子集化操作的更多信息:http://www.ats.ucla.edu/stat/r/modules/subsetting.htm

如果你想把它作为一个函数包装起来,它将如下所示:

new_entries <- function(data, rows_since){

  data[data$created > as.POSIXct(rows_since), ]

}

new_entries(df, "2013-01-05 18:01:00")