количество посещений по данным по факторной группе? - PullRequest
0 голосов
/ 06 февраля 2012

G'day All,

Я работаю в R. Извините за этот действительно базовый вопрос, но я немного застрял. У меня есть набор данных подсчета точек присутствия / отсутствия с датой подсчета и номером сайта (см. Ниже). Я хотел бы в конечном итоге создать 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

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

По сути, вы хотите преобразовать свои данные из длинного формата в широкий, с повторяющимися наблюдениями из Site в одну строку.Функция R base 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 голосов
/ 06 февраля 2012

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

require(plyr); require(reshape2); require(lubridate)
df <- ddply(df, .(Site), transform, visit = rank(dmy(date)))
dcast(df, Site ~ visit, value.var = 'date')
0 голосов
/ 06 февраля 2012

Вот еще одно решение с 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
...