Факторы счета, встречающиеся в группе в R - PullRequest
7 голосов
/ 25 октября 2011

Это мои данные:

> head(Kandula_for_n)
                date      dist  date_only
1 2005-05-08 12:00:00  138.5861 2005-05-08
2 2005-05-08 16:00:00 1166.9265 2005-05-08
3 2005-05-08 20:00:00 1270.7149 2005-05-08
6 2005-05-09 08:00:00  233.1971 2005-05-09
7 2005-05-09 12:00:00 1899.9530 2005-05-09
8 2005-05-09 16:00:00  726.8363 2005-05-09

Теперь я хотел бы иметь дополнительный столбец с количеством (n) записей данных (dist) за день .Для 2005-05-08 это будет n = 3, поскольку в 12, 16 и 20 часов будет 3 записи данных.Я применил следующий код, который фактически дал мне желание, которое я хотел:

ndist <-tapply(1:NROW(Kandula_for_n), Kandula_for_n$date_only, function(x) length(unique(x)))

После ndist<-as.data.frame(ndist) я получил это:

> head(ndist)
           ndist
2005-05-08     3
2005-05-09     4
2005-05-10     6
2005-05-11     4
2005-05-12     6
2005-05-13     6

Проблема в том, что счетчик находится вместе сdate_only в одном столбце, который называется ndist.Но мне нужно, чтобы они были в двух отдельных столбцах, один с количеством и один с date_only.Как это может быть сделано?Я думаю, это довольно просто, но я просто не понимаю.Буду признателен, если вы подскажете мне что-нибудь об этом.

Спасибо за ваши усилия.

Ответы [ 3 ]

8 голосов
/ 26 октября 2011

Просто потому, что мне трудно tapply() обернуть свой мозг, мне нравится использовать plyr для таких типов вещей:

## make up some data
## you get better/faster/more answers if you do this bit for us :)
dates <- seq(Sys.Date(), Sys.Date() + 5, by = 1)
Kandula_for_n <- data.frame(date_only = sample( dates + 5, 10, replace=TRUE ) , dist=rnorm(10) )

require(plyr)
ddply(Kandula_for_n, "date_only", function(x) data.frame(x, ndist=nrow(x)) )

Это даст вам что-то вроде:

    date_only       dist ndist
1  2011-10-30  0.2434168     5
2  2011-10-30 -0.9361780     5
3  2011-10-30  1.4593197     5
4  2011-10-30 -0.1851402     5
5  2011-10-30  0.6652419     5
6  2011-10-31  0.8876420     1
7  2011-11-03  0.5087175     2
8  2011-11-03 -1.0065152     2
9  2011-11-04  0.4236352     2
10 2011-11-04  0.4535686     2

строка ddply:

ddply(Kandula_for_n, "date_only", function(x) data.frame(x, ndist=nrow(x)) )

принимает входные данные, группирует их по полю date.only и для каждого уникального значения применяет анонимную функцию ккадр данных состоит только из записей с одинаковым значением для date_only.Моя анонимная функция просто берет data.frame x и добавляет столбец с именем ndist, который является числом строк в x.

4 голосов
/ 25 октября 2011

Это только названия строк. Тебе хорошо идти:

ndist$date = row.names(ndist)

РЕДАКТИРОВАТЬ: или ndist = data.frame(date = names(ndist), ndist) в зависимости от того, является ли это уже фреймом данных или нет.

3 голосов
/ 25 октября 2011

Как насчет чего-то более простого:

as.data.frame(table(unique(Kandula_for_n)$date_only))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...