0

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つですが、それより少ない場合も多い場合もあります。日付とサイト番号の両方が一致する場合は、サイトごとに1つのエントリを使用して、各パラメータの平均/平均読み取り値の詳細を示す新しいデータフレームを作成します。空のセルまたは「na」セルを計算および後続のデータフレームから省略したいのですが。

これが適用関数なのか、rowMeansのバージョンなのかわかりません。非常に立ち往生しています、どんな助けでも大歓迎です!

4

5 に答える 5

4

ニコの答えは、NA(集約された列)が結果を妨害しないように、mean()に渡される名前付き引数を追加したことを除いて、私のように見えました。(OPがby変数またはotehr変数のNAが既知であるか、NAを持っている疑いがあるかを尋ねているかどうかはわかりませんでした):

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

NA以外の値の数をカウントするには、集約呼び出しまたはtapply呼び出しも並行して実行する必要があります。

na.action = na.omitがデフォルトであるため、aggregateのformulaメソッドを使用する他のメソッドは異なる場合があります。

aggregate( . ~Site +Date, data=df,  FUN=mean, na.rm=TRUE)
于 2010-11-28T22:59:45.917 に答える
3

plyrパッケージとそのddply()機能を使用する1つの方法は次のとおりです。

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> 

カスタム無名関数を使用して、最初の3列をスキップしました。

于 2010-11-28T22:17:00.167 に答える
3

使用することもできますaggregate

aggregate(df, by=list(df$Site, df$Date), FUN=mean, na.rm=TRUE)
于 2010-11-28T22:36:00.740 に答える
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> 
于 2010-12-02T15:36:53.733 に答える
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)]

繰り返しになりますが、ほとんどの場合、他の回答で説明されているように、既定の関数を使用する必要があります。ただし、独自のソリューションを作成する方が速い場合もありますが、上記はこれを実現するためのガイドとして機能する場合があります。

于 2010-11-29T09:24:15.113 に答える