繁体   English   中英

根据外部条件对连续的条目数进行计数

[英]Count number of entries in a row based on external criteria

我有以下数据框:

    Date1              Date2            Date3               Date4              Date5 
1    25 April 2005       10 May 2006   28 March 2007   14 November 2007      1 April 2008  
2    25 April 2005       10 May 2006   28 March 2007   14 November 2007      1 April 2008  
3  29 January 2008   4 December 2008    6 April 2009       1 March 2010   NA 
4  29 January 2008   4 December 2008    6 April 2009       1 March 2010   1 February 2010  
5  29 January 2008   4 December 2008    6 April 2009       1 March 2010   1 February 2010  
6  29 January 2008   4 December 2008    6 April 2009       NA             NA 

以及以下向量:

   1 01/09/2004 
   2 20/03/2007 
   3 16/09/2009 
   4 16/09/2009 
   5 15/07/2008 
   6 16/09/2009

我想对数据框每一行中的日期进行计数,这些日期与向量中的日期相同或在日期之前。 例如,对于第一行,计数应为零,因为所有日期都在向量中的相应日期之后。

有人知道该怎么做吗?

这是dput()命令的输出,因此你们可以更轻松地将数据读入R进行测试(如果需要):

数据帧:

structure(c(" 25 April 2005 ", " 25 April 2005 ", " 29 January 2008 ", 
" 29 January 2008 ", " 29 January 2008 ", " 29 January 2008 ", 
" 10 May 2006 ", " 10 May 2006 ", " 4 December 2008 ", " 4 December 2008 ", 
" 4 December 2008 ", " 4 December 2008 ", " 28 March 2007 ", 
" 28 March 2007 ", " 6 April 2009 ", " 6 April 2009 ", " 6 April 2009 ", 
" 6 April 2009 ", " 14 November 2007 ", " 14 November 2007 ", 
" 1 March 2010 ", " 1 March 2010 ", " 1 March 2010 ", " 1 March 2010 ", 
" 1 April 2008 ", " 1 April 2008 ", " 1 February 2010 ", " 1 February 2010 ", 
" 1 February 2010 ", " 1 February 2010 "), .Dim = c(6L, 5L), .Dimnames = list(
    c("1", "2", "3", "4", "5", "6"), c("Rep1", "Rep2", "Rep3", 
    "Rep4", "Rep5")))

向量:

c("01/09/2004", "20/03/2007", "16/09/2009", "16/09/2009", "15/07/2008", 
"16/09/2009")

如果data.frame被称为m和向量v ,则简单

rowSums(m<=v)

应该这样做(这是可行的,因为m由R表示为紧随其后的列的矢量,并且v将被回收)。 不过,首先请确保所有日期均为POSIXctDate 有关此转换本身的信息,请参见此问题

第一件事:您真的必须将所有内容都转换为日期,这可能有点棘手。 我读入矩阵为Data,向量读为vect。 然后 :

vect <- as.Date(vect,format="%d/%m/%Y")

# Due to the apart nature of the Date class, the normal apply-solutions 
# don't give the result you're looking for.
Data <- as.data.frame(Data)
for (i in 1:ncol(Data)){
    Data[,i] <- as.Date(Data[,i],format="%d %B %Y")
}
> apply(Data,2,"<=",vect)
      Rep1  Rep2  Rep3  Rep4
[1,] FALSE FALSE FALSE FALSE
[2,]  TRUE  TRUE FALSE FALSE
[3,]  TRUE  TRUE  TRUE FALSE
[4,]  TRUE  TRUE  TRUE FALSE
[5,]  TRUE FALSE FALSE FALSE
[6,]  TRUE  TRUE  TRUE FALSE

> rowSums(apply(Data,2,"<=",vect))
[1] 0 2 3 3 1 3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM