我不知所措!我试图通过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"
答案 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