2016-08-15 58 views
1

在該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)

回答

2

如果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

2

一種方式做一些數據的每個子集是使用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