计算数据的唯一天数总数

时间:2011-12-08 12:46:03

标签: r dataframe

我正在开发一个显示人们旅行方式的大型数据集。我需要计算人们旅行的独特日数。下表显示了ID,它对每个特定的人都是唯一的。与每个ID相关联的是他们旅行的日期 - 对于某些人来说这可能是每天一次旅行,对于其他人来说,每天可能有多次旅行(例如,人“1”在4日进行了两次旅行)。我需要做的是选择数据集中所有人的唯一天数总数(例如,人1 = 2,人2 = 3,人3 = 1,人4 = 2 - 因此总使用迷你 - 下面的数据集应为8。

ID = c(1,1,1,2,2,2,2,3,4,4,4,4)
date = c("4th Nov","4th Nov","5th Nov","5th Nov","6th Nov","7th Nov","7th Nov","8th Nov","6th Nov","6th Nov","7th Nov","7th Nov")
data<-data.frame(ID,date)

我们将非常感谢有关R编码的任何建议。

非常感谢。

3 个答案:

答案 0 :(得分:5)

你应该与plyr包结交朋友。 ddply函数使得这一分析非常简单。需要data.frame,根据某些标准(在本例中为ID)将其拆分,应用函数并将这些块组合成data.frame

library(plyr)
ddply(data, .(ID), summarise, days=length(unique(date)))
  ID days
1  1    2
2  2    3
3  3    1
4  4    2

或者使用基数R,使用splitsapply来获得包含所需结果的向量:

sapply(with(data, split(date, ID)), function(x)length(unique(x)))
1 2 3 4 
2 3 1 2 

答案 1 :(得分:4)

再一次ddply的任务:

ddply(data, .(id), summarise, noDays = length(unique(date)))

  ID noDays
1  1      2
2  2      3
3  3      1
4  4      2

答案 2 :(得分:4)

也可以使用基础R的tapply

with(data, tapply(date, ID, function(x) length(unique(x))))

作为length(unique(x))的替代方案,您可以利用date是一个因素并计算水平的事实。

with(data, tapply(date, ID, function(x) nlevels(x[, drop = TRUE])))

奖金想法:

要解决定义名为“date”的变量的问题,请注意您可以在调用data.frame时包含向量,如下所示。

data <- data.frame(
  ID = c(1,1,1,2,2,2,2,3,4,4,4,4),
  date = c("4th Nov","4th Nov","5th Nov","5th Nov","6th Nov","7th Nov","7th Nov","8th Nov","6th Nov","6th Nov","7th Nov","7th Nov")
)

当您拥有包含大量重复内容的字符串时,通常最好使用paste来编写它们。您可以使用

更加巧妙地创建日期字符串
paste(c(4, 4, 5, 5, 6, 7, 7, 8, 6, 6, 7, 7), "th Nov", sep = "")

最后,如果您想对日期进行任何类型的分析,您需要将它们存储为多种日期格式之一。为此,您最好不要打扰“th”,但要将日期保存在计算机易于解析的形式中,例如“dd / mm / yyyy”。然后拨打strptime