我正在研究一个显示人们旅行方式的大型数据集.我需要计算人们旅行的独特日数.下表显示了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)
Run Code Online (Sandbox Code Playgroud)
我们将非常感谢有关R编码的任何建议.
非常感谢.
你应该和plyr
包裹交朋友.该ddply
功能使得这一点分析非常简单.它需要a 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
Run Code Online (Sandbox Code Playgroud)
或者使用基数R,使用split
和sapply
获得具有所需结果的向量:
sapply(with(data, split(date, ID)), function(x)length(unique(x)))
1 2 3 4
2 3 1 2
Run Code Online (Sandbox Code Playgroud)
也可以tapply
从基础 R 开始。
with(data, tapply(date, ID, function(x) length(unique(x))))
Run Code Online (Sandbox Code Playgroud)
作为替代方案,length(unique(x))
您可以利用date
作为因素的事实并计算水平。
with(data, tapply(date, ID, function(x) nlevels(x[, drop = TRUE])))
Run Code Online (Sandbox Code Playgroud)
奖金想法:
要解决定义名为“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")
)
Run Code Online (Sandbox Code Playgroud)
当您的字符串包含大量重复内容时,通常最好使用paste
. 可以使用更简洁地创建您的日期字符串
paste(c(4, 4, 5, 5, 6, 7, 7, 8, 6, 6, 7, 7), "th Nov", sep = "")
Run Code Online (Sandbox Code Playgroud)
最后,如果您想对日期进行任何类型的分析,您需要以多种日期格式之一存储它们。为此,您最好不要在意“th”,而是将日期保留在计算机易于解析的形式中,例如“dd/mm/yyyy”。然后调用strptime
。