Подсчитать количество записей в строке на основе внешних критериев - PullRequest
2 голосов
/ 30 августа 2010

У меня есть следующий фрейм данных:

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

Ответы [ 2 ]

3 голосов
/ 30 августа 2010

Если data.frame называется m, а вектор v, то должен подойти простой

rowSums(m<=v)

(это работает, потому что m представляется R как вектор, склеенный из следующих столбцов,и v будет переработано).Тем не менее, сначала убедитесь, что все даты POSIXct с или Date с;см. вопрос для получения информации о самом преобразовании.

2 голосов
/ 30 августа 2010

Первое: вам действительно нужно все преобразовать в даты, и это может быть немного сложно. Я прочитал в матрице как данные, а вектор как 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...