List r tapply使用do.call(rbind)或ddply的组合结果

List r tapply使用do.call(rbind)或ddply的组合结果,list,r,apply,plyr,do.call,List,R,Apply,Plyr,Do.call,我有日期/时间信息,我想得到“季节”中按年份分组的日期的平均值、最小值、最大值和范围,唯一稍微成功的方法是使用tapply。最接近的是tapply中的摘要函数。结果是什么,我只是假设是一个列表,由最小,最大,第一季度,中位数等年。这些不完全是我需要的,但工作良好 我从第1季的tapply函数中获得的结果示例: $`2003` Min. 1st Qu. Median

我有日期/时间信息,我想得到“季节”中按年份分组的日期的平均值、最小值、最大值和范围,唯一稍微成功的方法是使用tapply。最接近的是tapply中的摘要函数。结果是什么,我只是假设是一个列表,由最小,最大,第一季度,中位数等年。这些不完全是我需要的,但工作良好

我从第1季的tapply函数中获得的结果示例:

$`2003`
                     Min.                   1st Qu.                    Median                      Mean                   3rd Qu.                      Max. 
"2003-04-22 00:00:00 UTC" "2003-05-03 00:00:00 UTC" "2003-05-12 00:00:00 UTC" "2003-05-10 02:00:00 UTC" "2003-05-18 00:00:00 UTC" "2003-05-21 00:00:00 UTC" 

$`2004`
                     Min.                   1st Qu.                    Median                      Mean                   3rd Qu.                      Max. 
"2004-04-07 00:00:00 UTC" "2004-04-13 00:00:00 UTC" "2004-05-10 00:00:00 UTC" "2004-05-01 07:08:56 UTC" "2004-05-11 12:00:00 UTC" "2004-05-20 00:00:00 UTC" 
我想做的是将我为不同季节生成的这些列表合并到一个大的快乐数据框中,然后导出到csv中。我找了又找,越来越糊涂了。大多数人认为最简单的是

test = do.call(rbind, sSM, eSM, sC) #note here sSM, eSM, sC are my "seasons"
但是,这会给我一条错误消息或一个空的“测试”帧

我阅读了plyr软件包,并假设ddply而不是tapply将结果强制输入到数据帧中应该可以工作,但我不知道如何使其工作,因为我无法让它完成我需要的功能,如平均值、最小值、最大值和范围

我想要的最终结果是:

Season   Year   Min           Max      Mean        Median  
sSM     2003   2003-04-21   2003-5-1  2003-4-25   2003-4-23
eSM     2003...
sSM     2004...
eSM     2004...
然后我想做完全相同的事情,只在个人内跨年确定。我有一个ID字段,在某些年里,同一个人被测量过。我想得到一个平均开始日期为个人跨年在每个赛季。剔除那些多年未被测量的个体

因为我不知道如何操作列表和数组,甚至不知道tapply在做什么,所以我不知道如何修复所有这些。我是否创建了一个空的数据帧,并将所有这些内容以某种循环或其他方式放入其中?下面是几年中4个“季节”的一些样本数据。注意,有些日期有日期和时间戳,有些日期只有日期

    structure(list(Year = c(2003L, 2003L, 2003L, 2003L, 2003L, 2003L, 
2003L, 2004L, 2004L, 2004L, 2004L, 2004L, 2004L, 2005L, 2005L, 
2005L, 2005L, 2005L, 2005L, 2006L, 2006L, 2006L, 2006L), ID = structure(c(11L, 
12L, 13L, 14L, 15L, 16L, 17L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 14L, 15L, 1L, 2L, 3L, 6L), .Label = c("c_002", "c_102", 
"c_104", "c_105", "c_109", "c_401", "c_9814", "c_9815", "c_9816", 
"c_9819", "c_9901", "c_9902", "c_9905", "c_9908", "c_9911", "c_9912", 
"c_9916"), class = "factor"), sSM = structure(c(10L, 10L, 9L, 
17L, 8L, 8L, 7L, 18L, NA, 1L, NA, 15L, 13L, 12L, 6L, 3L, 5L, 
2L, 4L, 16L, 14L, 11L, 11L), .Label = c("04/07/2004 15:00", "04/23/2005 10:01", 
"04/25/2005 03:01", "04/27/2005 02:00", "04/27/2005 08:00", "04/29/2005 04:00", 
"05/01/2003", "05/03/2003", "05/04/2003", "05/05/2003", "05/05/2006", 
"05/07/2005 16:01", "05/11/2004 11:00", "05/11/2006", "05/13/2004 08:00", 
"05/14/2006", "05/17/2003", "05/17/2004 12:02"), class = "factor"), 
    eSM = structure(c(13L, 18L, 15L, 21L, 16L, 10L, 14L, 20L, 
    NA, 1L, NA, 11L, 7L, 5L, 6L, 17L, 3L, 2L, 4L, 19L, 9L, 12L, 
    8L), .Label = c("04/27/2004 05:00", "05/01/2005 05:00", "05/06/2005 05:00", 
    "05/08/2005 07:01", "05/12/2005 21:00", "05/15/2005 19:00", 
    "05/18/2004 13:00", "05/18/2006", "05/20/2006", "05/21/2003", 
    "05/21/2004 01:01", "05/23/2006", "05/24/2003", "05/25/2003", 
    "05/26/2003", "05/27/2003", "05/27/2005 01:00", "05/28/2003", 
    "05/28/2006", "06/01/2004 02:01", "06/03/2003"), class = "factor"), 
    sC = structure(c(9L, 12L, 16L, 19L, 18L, 12L, 7L, 13L, NA, 
    10L, NA, 20L, 4L, 14L, 11L, 5L, 1L, 2L, 3L, 8L, 17L, 6L, 
    15L), .Label = c("05/26/2005 00:00", "05/26/2005 10:00", 
    "05/27/2005 06:01", "05/28/2004 08:00", "05/29/2005 23:01", 
    "05/29/2006", "05/30/2003", "05/30/2006", "05/31/2003", "05/31/2004 06:01", 
    "05/31/2005 15:00", "06/01/2003", "06/01/2004 07:02", "06/01/2005 16:00", 
    "06/01/2006", "06/03/2003", "06/03/2006", "06/04/2003", "06/05/2003", 
    "06/05/2004 01:00"), class = "factor"), eC = structure(c(11L, 
    2L, 15L, 6L, 17L, 17L, 2L, 8L, NA, 7L, NA, 13L, 5L, 9L, 9L, 
    3L, 10L, 1L, 4L, 12L, 14L, 16L, 12L), .Label = c("06/03/2005 18:00", 
    "06/04/2003", "06/04/2005 04:01", "06/05/2005 05:01", "06/06/2004 22:00", 
    "06/07/2003", "06/07/2004 23:00", "06/08/2004 19:01", "06/08/2005 03:00", 
    "06/10/2005 20:00", "06/12/2003", "06/13/2006", "06/14/2004 00:00", 
    "06/14/2006", "06/16/2003", "06/18/2006", "06/19/2003"), class = "factor")), .Names = c("Year", 
"ID", "sSM", "eSM", "sC", "eC"), class = "data.frame", row.names = c(NA, 
-23L))
以下是我迄今为止编写的一些代码:

dates$StartSM =  as.POSIXct(strptime(dates$sSM,"%m/%d/%Y",tz="UTC"),tz="UTC")                 
dates$EndSM =  as.POSIXct(strptime(dates$eSM,"%m/%d/%Y",tz="UTC"),tz="UTC")
dates$EndC =  as.POSIXct(strptime(dates$eC,"%m/%d/%Y %H:%M",tz="UTC"),tz="UTC")
dates$StartC =  as.POSIXct(strptime(dates$sC,"%m/%d/%Y %H:%M",tz="UTC"),tz="UTC")
sSpringM = tapply(dates$StartSM, dates$Year, summary)
eSpringM  = tapply(dates$EndSM, dates$Year, summary)
sCalving = as.vector(tapply(dates$StartC, dates$Year, summary))
eCalving = tapply(dates$EndC, dates$Year, summary)
datadates = do.call(rbind, sSpringM, eSpringM, sCalving)
你有一个列表(不管怎么说,在顶部),称之为“你的列表”。请尝试以下方法打印它们:

lapply(yourlist, format, "%Y-%m-%d")
如果要将它们放入矩阵中:

do.call(rbind, sapply(yourlist, unlist))

我在你的结构中没有看到任何“冬天”、“春天”等。我过去曾使用data.table包的年、季、月和周函数返回年、季、月和周的数值向量。很容易用整数年加上适当的分数加法(如年(.)+季度/4)来绘制。比相应的剪切和标签麻烦更容易。

您能用
dput(youdatagoesher)
的输出替换数据的可读版本吗?确保开发的解决方案适合您会容易得多,因为数据类型等将完全匹配。@Chase,抱歉-我开始这么做,但后来没有……我想最好添加它。我只是觉得问题越来越长了。我只是想让人们知道,我一直在想办法,也在尝试。不用担心,我发现
dput()
在涉及日期/时间格式时特别有用……其中的差异似乎是很多困惑的根源。我仍然不明白你是如何定义春天和夏天的?将列
sSM
eSM
eC
sC
转换为上述适当的时间格式后,这些列是否有任何价值?能否详细说明数据的“季节”方面?正如德温在下面指出的,您提供的数据中似乎没有任何季节,另外我要指出的是,该样本中的所有日期都在4月至6月之间。@Joran对季节上的混淆表示抱歉-我应该更清楚一些。在我的“讨论”中,我以季节为例,用一般人都能理解的术语来表达。我不认为它们在实际数据中的标签有什么关系。我会纠正这一点。至于我的样本数据,我有126000个数据点。限制在四月和六月是我减少开支的方法。我有15个“赛季”-所以我想如果我能得到任何帮助,我会把它扩展到我自己的每个赛季。很抱歉,我不应该有混合词。sSM是我自己的唱片季。从技术上讲,这是春季迁徙的开始,eSM是春季迁徙的结束,sC是产犊的开始等等。我想要编译的是我不同的“季节”,不管它们被称为什么-平均日期、最小值和最大值是什么时候?然后,按个人的年数计算,他们在特定季节内的单独平均日期是什么时候。