2013-11-19 3 views
2

Пример моих данных выглядит следующим образом:Вычислить диапазон данных с перерывами для отсутствующих значений - R

site<-c("A","B","C","D") 
year1<-c(1990,1990,1990,1990) 
year2<-c("",1991,1991,1991) 
year3<-c(1992,1992,1992,1992) 
year4<-c(1993,"",1993,"") 
year5<-c(1994,1994,1994,1994) 
dat<-data.frame(site,year1,year2,year3,year4,year5) 

Я хотел бы, чтобы вычислить диапазон данных для каждой строки (или сайт в данном примере), но Я хотел бы включить разрывы, в которых отсутствуют отсутствующие значения.

Итак, создаем столбец, похожий на нечто подобное.

dat$year_range<-c("1990, 1992-1994","1990-1992, 1994","1990-1994","1990-1992, 1994") 

Спасибо.

+0

Это просто для вывода? В противном случае это не очень полезно. – Roland

ответ

2

Вот предложение, я полагаю, что это можно было бы сделать более простым способом:

dat$year_range <- apply(dat[-1], 1, function(x) { 
    x <- as.integer(x) 
    paste(tapply(x[!is.na(x)], cumsum(is.na(x))[!is.na(x)], function(y) 
    paste(unique(range(y)), collapse = "-")), collapse = ", ") 
}) 

# site year1 year2 year3 year4 year5  year_range 
# 1 A 1990  1992 1993 1994 1990, 1992-1994 
# 2 B 1990 1991 1992  1994 1990-1992, 1994 
# 3 C 1990 1991 1992 1993 1994  1990-1994 
# 4 D 1990 1991 1992  1994 1990-1992, 1994 
2

Вот некоторые регулярное выражение-фу для вас (чтение/попробовать изнутри):

gsub(',+', ',', # final cleanup of multiple commas 
    gsub('(^,+|,+$)', '', # cleanup of commas at end of start 
    # the meat - take out adjacent years and replace them with a '-' 
    gsub('((?<=,,)|^)([0-9]+),([0-9]+,)+([0-9]+)((?=,,)|$)', 
     ',\\2-\\4,', 
     apply(dat[, -1], 1, paste, collapse = ","), perl = TRUE))) 
#[1] "1990,1992-1994" "1990-1992,1994" "1990-1994"  "1990-1992,1994" 
+1

(+1) Это замечательно! Впечатляющее использование регулярных выражений. –

+0

perl: это так ясно и легко читать! – rawr

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