你能帮我弄清楚为什么以下不起作用吗?我有一个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。为什么?
答案 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")