2013-03-18 2 views
0

Я работаю над большим набором данных, и я хочу найти даты, общие для всех сайтов.Найти даты, общие для всех сайтов в фрейме данных

site <- c(1,1,1,2,2,2,2,3,3,4,4,4) 
date <- c("4th Nov","5th Nov","6th Nov","5th Nov","6th Nov","7th Nov","8th Nov","5th Nov","6th Nov","6th Nov","7th Nov","8th Nov") 
temperature <- c(3,5,7,3,6,8,5,3,5,7,8,9) 
data <- data.frame(site,date,temperature) 

common.dates(data) 
[1] "6th Nov" 

Любая помощь будет принята с благодарностью. Благодаря!

+1

Пожалуйста, определите «общий для всех сайтов». –

+0

Нет ни одной даты, встречающейся на этих сайтах! –

+0

Спасибо, что заметили это. – Brian

ответ

1

Вы можете сделать это (даже если он не оптимизирован):

dates <- union(NULL,data$date) 
sites <- union(data$site,NULL) 

w <- array(0,length(dates)) # number sites per date 
for (i in sites) 
    for (j in 1:length(dates)) 
     w[j] <- w[j] + dates[j] %in% data$date[data$site==i] 

dates[w == length(sites)] # returns the dates common to all sites 
+0

Это работает лучше на самом деле! – Brian

+0

Вы имеете в виду, что это быстрее? – Pop

+0

Я имею в виду, что 'Reduce (intersect, split (data $ date, data $ site))' не будет работать на моем «реальном» фрейме данных, и я не уверен, почему ... но ваш метод будет. Поскольку это вопрос, связанный с работой, я не уверен, стоит ли мне сразу же его устранить. Может быть, позже, но я просто хотел сказать, что этот метод более гибкий, чем другой. – Brian

2

Один из способов использования plyr:

with(ddply(data, .(date), function(x) all(1:4 %in% x$site)), date[V1 == TRUE]) 
# [1] 6th Nov 
6

Он работает с комбинацией split, intersect и Reduce:

Reduce(intersect, split(data$date, data$site)) 

[1] "6th Nov" 
+0

@Arun Наконец-то вы получили свой пример «Уменьшить» ... –

+0

Да, хотя это сделало бы меня счастливее, если бы я подумал об этом пятном решении! :) – Arun

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