2013-07-20 4 views
0

году У меня есть набор данные с данными об осадках в нескольких участках мониторинга:Поиск первого вхождения значения по

structure(list(date = structure(1:10, .Label = c("2010-01-01", 
"2010-01-02", "2010-01-03", "2010-01-04", "2010-01-05", "2010-01-06", 
"2010-01-07", "2010-01-08", "2011-01-01", "2011-01-02"), class = "factor"), 
    site1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), site2 = c(0.7, 0, 
    1.4, 0, 0, 0, 2.2, 0, 0, 2.2), site3 = c(0, 0, 0, 0, 0, 1.3, 
    0.6, 0, 1.3, 0.6), site4 = c(0L, 0L, 0L, 0L, 0L, 0L, 2L, 
    0L, 0L, 2L), site5 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), site6 = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), site7 = c(0, 0, 0, 1, 0, 4, 3, 
    1, 4, 3), site8 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("date", 
"site1", "site2", "site3", "site4", "site5", "site6", "site7", 
"site8"), class = "data.frame", row.names = c(NA, -10L)) 

Мне нужно найти первое вхождение любого значения выше 0 в каждый год на каждых сайтах. Я понятия не имею, как это сделать. Результат должен выглядеть следующим образом: [data frame is good]:

year site1 site2 site3 site4 site5 site6 site7 site8 
2001 01-02 01-02 01-02 01-02 01-01 02-02 01-01 01-02 
2002 01-03 01-02 02-02 01-02 01-02 01-03 01-02 04-02 
2003 01-02 01-05 01-02 01-02 05-02 01-02 01-07 01-02 
2004 05-02 01-02 01-02 07-02 01-02 05-02 01-02 01-06 

Как это сделать в R?

Спасибо, J.

+2

Просьба [воспроизводимый пример] (http://stackoverflow.com/q/5963269/271616), что вы «Пробовал. И посмотрите [FAQ о том, как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask). –

+0

Может также добавить ожидаемый результат? Это 'c (2010-01-01,0.7)'? – agstudy

+1

Пожалуйста, перечитайте комментарий Джошуа и ссылки, которые он предоставил. – GSee

ответ

2

Как насчет этого?

mydata <- read.table(text="date site1 site2 site3 site4 site5 site6 site7 site8 
2010-01-01 0.0 0.7 0.0 0 0.0 0.0 0.0 0.0 
2010-01-02 0.0 0.0 0.0 0 0.0 0.0 0.0 0.0 
2010-01-03 0.0 1.4 0.0 0 0.0 0.0 0.0 0.0 
2010-01-04 0.0 0.0 0.0 0 0.0 0.0 1.0 0.0 
2010-01-05 0.0 0.0 0.0 0 0.0 0.0 0.0 0.0 
2010-01-06 0.0 0.0 1.3 0 0.0 0.0 4.0 0.0 
2010-01-07 0.0 2.2 0.6 2 0.0 0.0 3.0 0.0 
2010-01-08 0.0 0.0 0.0 0 0.0 0.0 1.0 0.0 
2011-01-01 0.0 0.0 1.3 0 0.0 0.0 4.0 0.0 
2011-01-02 0.0 2.2 0.6 2 0.0 0.0 3.0 0.0",h=T) 

year <- format(as.Date(mydata$date),"%Y") 
rownames(mydata) <- mydata[,1] 
my.first <- function(x) head(names(x)[x],1) 
do.call("rbind",(by(mydata[,-1]>0,year, function(x) apply(x,2,my.first)))) 

Какой должен вывести (предполагающие строки упорядочены по дате):

 site1  site2  site3  site4  site5  site6  site7  site8  
2010 Character,0 "2010-01-01" "2010-01-06" "2010-01-07" Character,0 Character,0 "2010-01-04" Character,0 
2011 Character,0 "2011-01-02" "2011-01-01" "2011-01-02" Character,0 Character,0 "2011-01-01" Character,0 
+0

Большое спасибо, он отлично работает (на нормальном фрейме данных)! И у меня есть еще один вопрос - как я могу использовать его на объекте xts? –

+0

Я так же думаю по строкам ... 'library (xts); my.first <- function (x) head (имена (x) [x], 1); данные (sample_matrix); year <- format (as.Date (rownames (sample_matrix)), "% Y"); sample.xts <- as.xts (sample_matrix); do.call («rbind», by (sample.xts> 50, year, function (x) apply (x, 2, my.first))) '... (в этом случае поиск значений> 50) – texb

+0

Это было достаточно: my.first <- function (x) head (имена (x) [x], 1) do.call ("rbind", by (aln_miastax> 0, год, функция (x) применяется (x, 2, my.first))) Спасибо! –

Смежные вопросы