2012-02-05 2 views
0

G'day All,посещать число по данным по группе факторов?

Я работаю в Р. Извините, что это действительно основной вопрос, но я немного застрял. У меня есть набор данных о количестве точек присутствия/отсутствия с датой подсчета и номером сайта (см. Ниже). Я хотел бы, в конечном счете, создать data.frame, который сопоставляет все подсчеты по номеру ячейки сетки и каждый раз посещает сайт в качестве нового посещения (см. Ниже). Я не могу понять, как это сделать, поэтому подумал, что я возьму более простой маршрут и сделаю столбец, который даст номер посещения для каждой записи. Таким образом, столбец будет давать число для каждой записи к дате посещения в каждой группе сайтов (см. Ниже). Я тоже не могу понять, как это сделать! Любая помощь будет большой, спасибо заранее.

С наилучшими пожеланиями, Адамом

Я это:

Site date 
1 12/01/2000 
1 24/02/2000 
1 13/08/2001 
2 14/01/2000 
2 21/01/2002 
3 1/01/1999 
3 21/04/2000 

В конечном счете хочет:

Site   vist1    v2     v3 
1    12/01/2000   24/02/2000   13/08/2001 
2    14/01/2000   21/01/2002   na 
3    01/01/1999   21/04/2000   na 

Но это было бы хорошо:

Site date  visit 
1  12/01/2000 1 
1  24/02/2000 2 
1  13/08/2001 3 
2  14/01/2000 1 
2  21/01/2002 2 
3  01/01/1999 1 
3  21/04/2000 2 
+0

Adam: Полезные примеры данных помогают нам. Если у вас есть эти загруженные, можете ли вы дать нам небольшое подмножество. 'Test_data = головка (данные); dput (data); 'затем вставить результаты из dput. Благодарю. – Maiasaura

+0

Также обратите внимание, что в окне редактирования {} сохраняется форматирование кода/данных. – Maiasaura

ответ

1

основных по вы хотите изменить свои данные из длинного формата в широкий формат, с повторными наблюдениями от Site все в одной строке. Базовая функция R reshape() была разработана именно для этой задачи.

Единственное (небольшое) осложнение состоит в том, что сначала необходимо добавить столбец (который я здесь называю obsNum), который идентифицирует, что является первым, вторым, третьим и т. Д. Наблюдением на Site. Установив timevar = "obsNum", вы можете сообщить reshape(), в какой столбец вы хотите поместить каждое из значений date.

df <- read.table(text = "Site date 
1 12/01/2000 
1 24/02/2000 
1 13/08/2001 
2 14/01/2000 
2 21/01/2002 
3 1/01/1999 
3 21/04/2000", header=T, stringsAsFactors=FALSE) 

df$obsNum <- unlist(sapply(rle(df$Site)$lengths, seq)) 
reshape(df, idvar="Site", timevar="obsNum", direction="wide") 

# Site  date.1  date.2  date.3 
# 1 1 12/01/2000 24/02/2000 13/08/2001 
# 4 2 14/01/2000 21/01/2002  <NA> 
# 6 3 1/01/1999 21/04/2000  <NA> 
+0

Спасибо Josh, , который работает! Я определенно буду проверять эти функции более подробно, они действительно полезны. С уважением, Adam – Adam

0

Вот еще одно решение с ddply и dcast.

library(reshape2) 
# Convert the date column into actual dates 
df$date <- as.Date(df$date, format="%d/%m/%Y") 
# Ensure that the data.frame is sorted 
df <- df[ order(df$site, df$date), ] 

# Number the visits for each site 
df$visit <- 1 
d <- ddply(df, "Site", transform, visit=cumsum(visit)) 

# Convert to a wide format 
# (Since dcast forgets the Date type, convert it to strings 
# before and back to dates after.) 
d$date <- as.character(d$date) 
d <- dcast(d, Site ~ visit, value.var="date") 
d[,-1] <- lapply(d[,-1], as.Date) 
d 
0

Вот еще взять на себя решение с использованием plyr и reshape2.

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