2010-11-28 2 views
0

У меня есть dataframe под названием ants детализация несколько записей для каждого сайта, выглядит следующим образом:Вычислить средства строк

Site  Date  Time Temp SpCond Salinity Depth Turbidity Chlorophyll 
1 71 6/8/2010 14:50:35 14.32 49.88 32.66 0.397  0.0   1.3 
2 71 6/8/2010 14:51:00 14.31 49.94 32.70 1.073  0.0   2.0 
3 71 6/8/2010 14:51:16 14.32 49.95 32.71 1.034  -0.1   1.6 
4 71 6/8/2010 14:51:29 14.31 49.96 32.71 1.030  -0.2   1.6 
5 70 6/8/2010 14:53:55 14.30 50.04 32.77 1.002  -0.2   1.2 
6 70 6/8/2010 14:54:09 14.30 50.03 32.77 0.993  -0.5   1.2 

Сайты имеют разное количество записей, как правило, 3, но иногда меньше или больше. Если совпадение даты и номера сайта, я хотел бы написать новый фреймворк с одной записью на сайт с подробным описанием средних/средних показаний для каждого параметра. Я бы хотел, чтобы пустые ячейки или «na» были исключены из расчета и последующего блока данных.

Я не уверен, что это применимая функция или версия rowMeans, может быть? Очень застрял, любая помощь очень ценится!

ответ

2

Вот полный новый ответ с полным журналом также охватывает вашу новую спецификацию:

R> Lines <- " Site  Date  Time Temp SpCond Salinity Depth Turbidity Chlorophyll 
+ 71 6/8/2010 14:50:35 14.32 49.88 32.66 0.397  0.0   1.3 
+ 71 6/8/2010 14:51:00 14.31 49.94 32.70 1.073  0.0   2.0 
+ 71 6/8/2010 14:51:16 14.32 49.95 32.71 1.034  -0.1   1.6 
+ 71 6/8/2010 14:51:29 14.31 49.96 32.71 1.030  -0.2   1.6 
+ 70 6/8/2010 14:53:55 14.30 50.04 32.77 1.002  -0.2   1.2 
+ 70 6/8/2010 14:54:09 14.30 50.03 32.77 0.993  -0.5   1.2 
+ " 
R> con <- textConnection(Lines) 
R> df <- read.table(con, sep="", header=TRUE, stringsAsFactors=FALSE) 
R> close(con) 
R> df$pt <- as.POSIXct(strptime(paste(df$Date, df$Time), "%m/%d/%Y %H:%M:%S")) 
R> library(plyr) 
R> newdf <- ddply(df, .(Site,Date), function(x) mean(x[,-(1:3)], na.rm=TRUE)) 
R> newdf$pt <- as.POSIXct(newdf$pt, origin="1970-01-01") 
R> newdf 
    Site  Date Temp SpCond Salinity Depth Turbidity Chlorophyll     pt 
1 70 6/8/2010 14.30 50.03 32.77 0.9975 -0.350  1.200 2010-06-08 20:54:02 
2 71 6/8/2010 14.32 49.93 32.70 0.8835 -0.075  1.625 2010-06-08 20:51:05 
R> 
+1

Ты УДИВИТЕЛЬНЫЙ, извините, я был настолько застрял! Это здорово и имеет для меня гораздо больше смысла ... СПАСИБО! И да, это уже закончилось :) – Joey

+0

Вы не можете себе представить, сколько раз я ударил головой о стену: a) фактор/персонаж, b) забыл «as.POSIXct» после «strptime» и c) чертово 'origin =' для recast в 'as.POSIXct'.Но, к счастью, я был на этом достаточно долго, что * в конечном итоге * он застрял :) –

+0

И, как в сторону, это одна из причин, по которой полностью воспроизводимые примеры гораздо полезнее в вопросах. Поэтому просто не показывайте 'print (df)', покажите код, который генерирует или использует 'dput (df)', который сериализует его компактно в ascii для отдыха. –

3

Вот один из способов использования plyr пакета и его ddply() функции:

R> df 
    Site  Date  Time Temp SpCond Salinity Depth Turbidity Chlorophyll 
1 71 6/8/2010 14:50:35 14.32 49.88 32.66 0.397  0.0   1.3 
2 71 6/8/2010 14:51:00 14.31 49.94 32.70 1.073  0.0   2.0 
3 71 6/8/2010 14:51:16 14.32 49.95 32.71 1.034  -0.1   1.6 
4 71 6/8/2010 14:51:29 14.31 49.96 32.71 1.030  -0.2   1.6 
5 70 6/8/2010 14:53:55 14.30 50.04 32.77 1.002  -0.2   1.2 
6 70 6/8/2010 14:54:09 14.30 50.03 32.77 0.993  -0.5   1.2 
R> library(plyr) 
R> ddply(df, .(Site,Date), function(x) mean(x[,-(1:3)], na.rm=TRUE)) 
    Site  Date Temp SpCond Salinity Depth Turbidity Chlorophyll 
1 70 6/8/2010 14.300 50.035 32.770 0.9975 -0.350  1.200 
2 71 6/8/2010 14.315 49.933 32.695 0.8835 -0.075  1.625 
R> 

Я использовал пользовательские анонимную функцию, чтобы пропустить первые три столбца.

+0

Вам нужен 'na.rm = TRUE, в вашем' mean' вызова там, Dirk –

+0

Да, хорошая идея -- благодаря! –

+0

Спасибо Dirk, это прекрасно работает, за исключением того, что столбец «Time» отсутствовал на выходе, поэтому я поменял его на: ddply (df,. (Site, Date), function (x) mean (x [, - (1: 2)] , na.rm = TRUE)), но это возвращает NA для значений под «Время», можно ли также усреднить время? – Joey

3

Вы также можете использовать aggregate

aggregate(df, by=list(df$Site, df$Date), FUN=mean, na.rm=TRUE) 
+0

так же, как мой комментарий к Дирку. Вам нужно добавить ', na.rm = TRUE' после' FUN = mean', чтобы исключить значения NA. –

+0

@ Gavin Simpson: отредактировал:) – nico

4

ответ Нико выглядел, как у меня было бы разве что я бы добавил именованный аргумент, передаваемый в виду(), так что NA (в агрегированных столбцов) будет не саботировать результаты. (Я не мог сказать, был ли OP с просьбой, что NA-х в переменными или в otehr переменных были известны или подозреваются в НС):

aggregate(df, by=list(df$Site, df$Date), FUN=mean, na.rm=TRUE) 

Вы, вероятно, потребуется также запустить агрегат или tapply вызовы параллельно для подсчета количества значений, отличных от NA.

Другой метод с использованием метода формулы агрегатных могут быть другими, так как na.action = na.omit по умолчанию:

aggregate(. ~Site +Date, data=df, FUN=mean, na.rm=TRUE) 
2

Вы были близки с rowMeans(), но вам нужно colMeans() вместо этого. Другие показали, как использовать встроенные или дополнительные функции, и я, конечно же, рекомендую вам их использовать. Тем не менее, это может быть полезно, чтобы увидеть, как сделать что-то вроде этого вручную:

## using df from Dirk's answer, we split the data in Site Date combinations 
df.sp <- with(df, 
       split(data.frame(Temp, SpCond, Salinity, Depth, Turbidity, 
           Chlorophyll), 
        list(Site = Site, Date = Date))) 
## The above gives a list of data frames one per date-site combo, 
## to which we apply the colMeans() function 
df.mean <- data.frame(t(sapply(df.sp, colMeans))) 

На этом этапе нам нужно сделать некоторую дополнительную уборку, если вы хотите, чтобы вывод, чтобы быть хорошим, как ответы чужих:

## Process the rownames on df.mean 
name.parts <- strsplit(rownames(df.mean), "\\.") 
## pull out the Site part (before the '.') 
df.mean <- within(df.mean, Site <- as.numeric(sapply(name.parts, `[`, 1))) 
## pull out the Date part (after the '.') 
df.mean <- within(df.mean, Date <- sapply(name.parts, `[`, 2)) 
## rearrange the columns 
df.mean <- df.mean[, c(7:8,1:6)] 

Примечание еще раз, для большинства случаев вы должны использовать консервированные функции, как описано в других ответах. Иногда, возможно, было бы быстрее приготовить собственное решение, и вышеупомянутое могло бы послужить руководством для достижения этого.

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

  • Нет связанных вопросов^_^