我正在开发一个显示人们旅行方式的大型数据集。我需要计算人们旅行的独特日数。下表显示了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编码的任何建议。
非常感谢。
答案 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,使用split
和sapply
来获得包含所需结果的向量:
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
。