通过一次观察对几个日期进行排序

时间:2013-11-28 18:41:16

标签: r sorting

我不知所措!我试图通过business_id对数据进行排序。每个id都有几个与之关联的日期。我正在尝试创建一个新变量,该变量显示与business_id关联的第一个和最后一个日期之间的天数。这样

row.names   business_id              Days
1   x8453   DxUn-ukNL27GOuwjnFGFKA   876

目前的数据结构如下:

row.names   date        business_id
1   X27038  2012-04-21  FV0BkoGOd3Yu_eJnXY15ZA
2   X60951  2012-05-14  Trar_9cFAj6wXiXfKfEqZA
3   X60462  2011-10-05  DxUn-ukNL27GOuwjnFGFKA
4   X2078   2010-12-19  PlcCjELzSI3SqX7mPF5cCw
5   X166883 2011-09-29  pF7uRzygyZsltbmVpjIyvw
6   X177828 2010-09-19  XkNQVTkCEzBrq7OlRHI11Q
7   X128628 2012-05-05  6TWRuHn24DL6vnW8Uyu4Vw
8   X202882 2011-12-10  Xo9Im4LmIhQrzJcO4R3ZbA
9   X64569  2012-02-07  Z67obTep38V9HMtA10yu5A
10  X14667  2009-07-18  xsSnuGCCJD4OgWnOZ0zB4A
11  X17432  2012-08-11  XkNQVTkCEzBrq7OlRHI11Q

提前致谢!

更新:

str(data)
'data.frame':   2299 obs. of  2 variables:
 $ date       :List of 2299
  ..$ X2736  : chr "2012-05-29"
  ..$ X160403: chr "2011-08-29"
  ..$ X19897 : chr "2010-09-27"
  ..$ X44519 : chr "2012-05-22"
  ..$ X75910 : chr "2012-10-22"
  ..$ X13052 : chr "2010-07-14"
    $ business_id:List of 2299
  ..$ X2736  : chr "EFJAVVBQQqftuqY5Wb3WtQ"
  ..$ X160403: chr "YDlk9buwF8JQE3JgQgraOw"
  ..$ X19897 : chr "sc1UacpE3cVNJueMdXiCyA"
  ..$ X44519 : chr "VY_tvNUCCXGXQeSvJl757Q"
  ..$ X75910 : chr "fowXs9zAM0TQhSfSkPeVuw"
  ..$ X13052 : chr "xM5F0cLAlKWoB8rOgt5ZOw"
  ..$ X87807 : chr "nLL0sjLdZ13YdvhXKyss7A"

2 个答案:

答案 0 :(得分:2)

现在编辑OP已提供结构:

您的数据结构非常奇怪。 R中的通常结构是data.frame,其在技术上是矢量列表,其中矢量的长度都相同。在您的情况下,您有两个(命名)列表的列表。

暂时存放在其他地方:

old.names <- names(x[[1]])

然后使用方便的data.frame函数将数据转换为普通unlist()

x$date <- unlist(x$date)
x$business_id <- unlist(x$business_id)

使用str(x)查看差异。名称现在可以返回,也是将“日期”列从字符转换为正确日期并按日期顺序排序的好时机。

x$old.names <- old.names
x$date <- as.POSIXct(x$date)
x <- x[order(x$date), ]

我原来的答案现在应该有效。

原始回答:

就像agstudy一样,我会使用plyr包,但是如果你有一个日期格式的“日期”列,并希望保持这种方式,你可以尝试:

require(plyr)
ddply(x, "business_id", summarise
      , duration = difftime(max(date), min(date), units = "days")
      , old.names = old.names[1])

这也为您提供了灵活性。

使用您的示例数据,按日期升序dat <- dat[order(dat$date), ]表示old.names[1]为您提供最早行的名称,old.names[length(old.names)]会为您提供最新行的名称但是我不知道在ddply内有魔法是否可靠。

进一步修改:

我只展示了如何处理名称,因为它们在你的例子中。它们看起来好像是最初来自导入数据的列标题,而R已经为它们添加了“X”,因为名称不允许以数字开头。

答案 1 :(得分:1)

使用plyr包:

ddply(dat,.(business_id),function(x)
  if(length(x$date)>1)
    diff(range(as.POSIXct(x$date)))
  else 0)

             business_id  V1
1  6TWRuHn24DL6vnW8Uyu4Vw   0
2  DxUn-ukNL27GOuwjnFGFKA   0
3  FV0BkoGOd3Yu_eJnXY15ZA   0
4  pF7uRzygyZsltbmVpjIyvw   0
5  PlcCjELzSI3SqX7mPF5cCw   0
6  Trar_9cFAj6wXiXfKfEqZA   0
7  XkNQVTkCEzBrq7OlRHI11Q 692
8  Xo9Im4LmIhQrzJcO4R3ZbA   0
9  xsSnuGCCJD4OgWnOZ0zB4A   0
10 Z67obTep38V9HMtA10yu5A   0
相关问题