【发布时间】:2019-11-15 14:31:36
【问题描述】:
我正在尝试使用 tapply 来获取每天捕获的海龟的平均重量。对于我尝试过的每种方法,tapply 为每个日期值(类:POSIXct)返回 NA
我试过了: 在重量列和日期列上调用 tapply -> 参数长度不同错误
在我的数据框的权重列中删除具有 NA 值的记录,然后在权重列和日期列上调用 tapply。 -> 参数长度不同错误
在权重列的 na.omit 调用和权重列的 na.omit 调用索引的日期列上调用 tapply -> 参数长度不同错误
在权重列的 na.omit 调用和权重列的 na.omit 调用索引的因子强制日期列上调用 tapply -> 为因子强制日期列的每个级别返回 NA
原始数据帧的头部
> head(stinkpotData)
Date DateCt Species Turtle.ID ID.Code Location Recapture Weight.g C.Length.mm
1 6/1/2001 2001-06-01 Stinkpot 1 1 keck lab dock site 0 190 95
2 6/1/2001 2001-06-01 Stinkpot 2 10 Right of dock 0 200 100
3 8/9/2001 2001-08-09 Stinkpot 2 10 #4 Deep Right of lab 1 175 104
4 8/27/2001 2001-08-27 Stinkpot 2 10 #4 Deep Right of lab 1 175 105
5 6/1/2001 2001-06-01 Stinkpot 3 11 Right of dock 0 200 109
6 10/3/2001 2001-10-03 Stinkpot 3 11 #4 Deep Right of lab 1 205 109
C.Width.mm Female.1.Male.2 Rotation Marks
1 70 <NA> <NA> <NA>
2 72 <NA> <NA> <NA>
3 72 2 <NA> Male
4 71 2 <NA> male, 1 small leech Right front leg
5 74 <NA> <NA> algae covered
6 76 2 <NA> male, 1 lg & 1 sm leech right rear leg
原始数据帧的头部,其中省略了 NA 权重的记录(检查了 NA 是否实际上被省略了)
> head(noNAWeightsDf)
Date DateCt Species Turtle.ID ID.Code Location Recapture Weight.g C.Length.mm
1 6/1/2001 2001-06-01 Stinkpot 1 1 keck lab dock site 0 190 95
2 6/1/2001 2001-06-01 Stinkpot 2 10 Right of dock 0 200 100
3 8/9/2001 2001-08-09 Stinkpot 2 10 #4 Deep Right of lab 1 175 104
4 8/27/2001 2001-08-27 Stinkpot 2 10 #4 Deep Right of lab 1 175 105
5 6/1/2001 2001-06-01 Stinkpot 3 11 Right of dock 0 200 109
6 10/3/2001 2001-10-03 Stinkpot 3 11 #4 Deep Right of lab 1 205 109
C.Width.mm Female.1.Male.2 Rotation Marks
1 70 <NA> <NA> <NA>
2 72 <NA> <NA> <NA>
3 72 2 <NA> Male
4 71 2 <NA> male, 1 small leech Right front leg
5 74 <NA> <NA> algae covered
6 76 2 <NA> male, 1 lg & 1 sm leech right rear leg
在原始数据框中的列上调用 tapply
> tapply(stinkpotData$Weight.g, stinkpotData$DateCt, FUN = mean)
Error in tapply(stinkpotData$Weight.g, stinkpotData$DateCt, FUN = mean) :
arguments must have same length
在 noNA 数据框中的列上调用 tapply
>tapply(noNAWeightsDf$Weight.g, noNAWeightsDf$DateCt, FUN = mean)
Error in tapply(noNAWeightsDf$Weight.g, noNAWeightsDf$DateCt, FUN = mean) :
arguments must have same length
在权重列和日期列的na.omit调用上调用tapply
> tapply(na.omit(stinkpotData$Weight.g), stinkpotData$DateCt[!is.na(stinkpotData$Weight.g)], FUN = mean)
Error in tapply(na.omit(stinkpotData$Weight.g), stinkpotData$DateCt[!is.na(stinkpotData$Weight.g)], :
arguments must have same length
在权重列和因子的na.omit调用上调用tapply-
coerced date column indexed by the na.omit call of the weight column
tapply(na.omit(stinkpotData$Weight.g), as.factor(stinkpotData$DateCt[!is.na(stinkpotData$Weight.g)]), FUN = mean)
2001-01-07 2001-06-01 2001-06-04 2001-06-06 2001-06-07 2001-06-11 2001-06-12 2001-06-15 2001-06-19
NA NA NA NA NA NA NA NA NA
2001-06-20 2001-06-25 2001-06-27 2001-06-29 2001-07-03 2001-07-09 2001-07-11 2001-07-13 2001-07-16
NA NA NA NA NA NA NA NA NA ................etc
There were 50 or more warnings (use warnings() to see the first 50)
在出现上述错误后调用 warnings():
> warnings()
Warning messages:
1: In mean.default(X[[i]], ...) :
argument is not numeric or logical: returning NA
2: In mean.default(X[[i]], ...) :
argument is not numeric or logical: returning NA
3: In mean.default(X[[i]], ...) :
argument is not numeric or logical: returning NA
.......................etc
编辑:
split(na.omit(stinkpotData$Weight.g), as.factor(stinkpotData$DateCt[!is.na(stinkpotData$Weight.g)]))
列出每个日期海龟的个体重量。验证它是模式列表。它的元素是模式数字,类因子。 lapply 在拆分列表上使用 FUN=mean 仍然为每个日期级别返回 NA。可以获得强制转换为向量的拆分列表的各个元素的方法,但不是我需要的。
编辑 2: 终于得到了我想要的结果,但是到达那里的步骤似乎过于复杂,我仍然不明白为什么使用 tapply 不起作用。我必须像第一次编辑一样调用 split,然后使用 lapply 将结果列表的每个元素强制为数字类(最初作为类因子返回),然后使用 lapply 对每个元素调用 mean:
weightsDateList = split(na.omit(stinkpotData$Weight.g), as.factor(stinkpotData$DateCt[!is.na(stinkpotData$Weight.g)]))
weightsDateList = lapply(weightsDateList, FUN = as.numeric)
weightsDateList = lapply(weightsDateList, FUN = mean)
编辑 3: 我现在意识到我从 EDIT 2 中的解决方案中得到的结果并调用 tapply( 严重低估了手段,所以仍然丢失。
编辑 4: 意识到将权重转换为类数值会返回权重作为因子时的级别数,这解释了均值的严重低估。
我希望 tapply 调用返回每个日期以及海龟重量及其在这些日期捕获的海龟的平均重量。谢谢,如果我遗漏了一些简单的东西,我深表歉意。
【问题讨论】:
-
你试过
aggregate(Weight.g ~ DateCt, data = stinkpotData, mean) -
除非你有理由,否则我建议不要使用tapply。
data.table和dplyr都提供了更简单的分组功能。我非常偏爱 data.table,但我建议同时查看并查看适合您的内容 -
我不认为
tapply有问题,但我很偏爱baseR。它的许多方法都提供分组功能:tapply、by、split、ave、aggregate等等。我建议检查一下,看看什么适合你。 -
请
dput复制此错误的实际原始数据框的几行。你检查了DateCt的 NA 吗? -
@heds1 aggregate(Weight.g ~ DateCt, data = stinkpotData, mean) 给出了无效类型错误,因为 DateCt 似乎是一个列表。我将它强制为一个因子,然后称为聚合,但它只是再次为每个级别返回 NA
标签: r date dataframe mean tapply