如何R中

问题描述:

在该R子集的时候,我有数据如何R中

USER BIRTH 
11  "2013-01-11 22:31:11" 
121 "2014-12-26 04:07:35" 
... 

我想创建一个新的数据集data_new包含的时间为10点至11点所有USERUSERBIRTH的类型是字符串/字符。我尝试这样做:

data_new= data$BIRTH > as.POSIXct("10:00:00", format="%H:%M:%S") 
& data$BIRTH < as.POSIXct("11:00:00", format="%H:%M:%S") 

但这里,r给我们FALSE所有条目,所以这不工作。 我该如何解决这个问题?

更新

说我要找到用户的所有小时数。我用的是答案,试试这个

u=c() 
for(j in 1:24) { 
data_new=data[times > "00:00:00"+(j-1) & times < "01:00:00"+j ,] 
#saving the number of users in vector u 
u[j]=dim(data_new)[1] 
} 

,但R可以想不通术语"00:00:00"+(j-1)

如果df是你的数据帧:

df <- read.table(text = 'USER BIRTH 
11  "2013-01-11 22:31:11" 
121 "2014-12-26 04:07:35" 
121 "2014-12-26 10:07:35" 
121 "2014-12-26 11:07:35" 
121 "2014-12-26 10:38:35"', header = T) 

df$BIRTH <- ymd_hms(df$BIRTH) 

times <- strftime(df$BIRTH, format = "%H:%M:%S") 
df[times > "10:00:00" & times < "11:00:00",] 

输出:

USER    BIRTH 
3 121 2014-12-26 10:07:35 
5 121 2014-12-26 10:38:35 
+0

是什么让你相信这是有效的? R不会和角色做数学运算。 –

+1

@ user6678274:此解决方案的潜在问题是它依赖于您的语言环境的排序顺序,这可能会提供意外的结果。看到我的答案替代。 –

+0

您将如何分组,以便获取2016年fe的固定年份的所有数据。 – user6678274

一种方式做一些数据的每个子集是使用split - lapply范例。在这种情况下,您需要将data$BIRTH转换为POSIXlt,并将其拆分为POSIXlt对象的hour组件。这将给你一个列表,其中每个列表元素包含特定小时的所有数据。

data <- read.csv(text = "USER,BIRTH 
11,2013-01-11 22:31:11 
12,2014-12-26 04:07:35 
21,2014-12-26 10:07:35 
121,2014-12-26 11:07:35 
112,2014-12-26 10:38:35") 

data_by_hour <- split(data, as.POSIXlt(data$BIRTH)$hour) 

然后你可以使用lapply(或sapply)做任何你想做的每一个部分数据的。要计算每小时的观察次数:

# number of observations for each hour 
sapply(data_by_hour, nrow) 
4 10 11 22 
1 2 1 1 

您也可以使用xts做到这一点。

library(xts) 
# Create xts object from 'data' data.frame 
# Note: xts objects are based on a matrix, so you cannot have columns with 
#  mixed types like you can with a data.frame. 
x <- xts(data["USER"], as.POSIXct(data$BIRTH)) 
period.apply(x, endpoints(x, "hours"), nrow) 
#      USER 
# 2013-01-11 22:31:11 1 
# 2014-12-26 04:07:35 1 
# 2014-12-26 10:38:35 2 
# 2014-12-26 11:07:35 1 

请注意,您可以使用xts执行时间子集。它避免了在字符串上使用逻辑运算符可能导致的与语言环境相关的排序规则问题。

x["T10:00/T11:00"] 
#      USER 
# 2014-12-26 10:07:35 21 
# 2014-12-26 10:38:35 112 
+0

谢谢,但我不知道这里的符号。对于大型数据集,我不应该粘贴所有数据。 – user6678274

+1

@ user6678274:您不会粘贴所有数据,并使用read.zoo(或read.table)的'text'参数来读取它。我这样做,所以你可以运行我的代码。我编辑了我的答案,从你的'data'对象开始。 R给出了这个错误,因为你没有加载xts包,所以我也将它添加到我的答案中。 –

+0

这是行得通的。假设我想要所有小时的所有结果1,...,24我很难做出for循环,因为我必须迭代一个字符串。否则,应该手动编写所有24个案例。 – user6678274