2015-01-04 74 views
2

我有以下數據框:如何計算和r中數據幀的標誌唯一值

data <- data.frame(week = c(rep("2014-01-06", 3), rep("2014-01-13", 3), rep("2014-01-20", 3)), values = c(1, 2, 3))

  week values 
1 2014-01-06  1 
2 2014-01-06  2 
3 2014-01-06  3 
4 2014-01-13  1 
5 2014-01-13  2 
6 2014-01-13  3 
7 2014-01-20  1 
8 2014-01-20  2 
9 2014-01-20  3 

我想在data計數獨特week併爲其分配一個以創建一個列連續的值,使得DF出現這樣的:

  week values seq_value 
1 2014-01-06  1 1 
2 2014-01-06  2 1 
3 2014-01-06  3 1 
4 2014-01-13  1 2 
5 2014-01-13  2 2 
6 2014-01-13  3 2 
7 2014-01-20  1 3 
8 2014-01-20  2 3 
9 2014-01-20  3 3 
+1

'數據$ seq_value < - 周(數據$周)',使用'lubridate'。 – Khashaa

回答

3

你可以通過轉換「我們使用base R ek「欄輸入factor,並指定水平值爲」周「的unique值。將factor轉換爲numeric並獲取關卡的數字索引。

data$seq_value <- with(data, as.numeric(factor(week,levels=unique(week)))) 
data$seq_value 
#[1] 1 1 1 2 2 2 3 3 3 

或者match「周」列該列的unique值來獲得numeric指數。

with(data, match(week, unique(week))) 
    #[1] 1 1 1 2 2 2 3 3 3 

或者使用data.table,首先轉換data.framedata.tablesetDT),然後獲得分組變量 '周' 的指數值(.GRP)並將其分配給新的列seq_value

library(data.table) 
setDT(data)[,seq_value:=.GRP, week][] 
+0

之前沒有用過比賽 - 很棒的功能......謝謝! – gh0strider18

+0

你甚至還需要levels參數嗎?我認爲如果沒有它,它可能會運行良好。 –

+0

@ gh0strider18,我喜歡akrun的答案中的選項,但是您應該意識到,如果每週只有完全唯一的日期條目,它們只能按預期工作。如果你在同一周有兩個不同的日期,它會分開標記它們。這同樣適用於DMC的dplyr回答。 –

4

我猜測慣用的方法只是計算所提供的日期之外的一年的實際周(如果你的周不是從一年的第一週開始的話)。

as.integer(format(as.Date(data$week), "%W")) 
## [1] 1 1 1 2 2 2 3 3 3 

另一個基礎R解決方案將使用as.POSIXlt類,並利用其yday屬性

as.POSIXlt(data$week)$yday %/% 7 + 1 
## [1] 1 1 1 2 2 2 3 3 3 

如果你想有一個更短的語法,data.table包(以及許多其他 - 見@Kshashaas評論)提供了一個快速包裝

library(data.table) 
week(data$week) 
## [1] 1 1 1 2 2 2 3 3 3 

這個軟件包最好的事情是,你可以創建列參考(類似到最後@akruns的解決方案,但可能更有效,因爲不需要by參數)

setDT(data)[, seq_value := week(week)] 
+0

我對這個問題的理解是,他們想要akrun的答案,即從1開始,因爲他們想要計算獨特的星期,並開始計數,例如5可能會令人困惑,IMO和IIUC。如果他們想要分配一個「順序」值,那麼如果這幾周有差距,那麼你的答案就是「錯誤的」,我認爲他們的意思是沒有差距的一個序列。 –

+0

但是,通常還是一個很好的答案! –

+0

是啊,你也許是對的,我沒有讀得很好...... –

2

一個dplyr解決方案:

library(dplyr) 
data %>% 
    mutate(seq_value = dense_rank(week)) 
+0

哇 - 是的 - 這是非常有用的 - 沒有意識到'dplyr'裏面的等級函數 – gh0strider18

相關問題