2015-08-29 32 views
0

下面是一個例子的數據幀:如何生成的數字中的R的不均勻序列

df <- data.frame(x=c(1,1,2,2,2,3,3,4,5,6,6,6,9,9),y=c(1,2,3,4,6,3,7,8,6,4,3,7,3,2)) 

我想根據每xy觀察次數,以產生一個數字序列(例如有2個y的觀察值爲x=1)。我希望序列不斷增加,並在每個x組後跳躍2。

在這個例子中所需的輸出將是:

1,2,5,6,7,10,11,14,17,20,21,22,25,26 

我怎樣才能在R請勿這根本?

+1

如果他們已經進行分組,並在你表現出的方​​式標記,不能你只要運行它作爲'$ DF rowname < - 1 :dim(df)[1]; df $ newNumber < - df $ rowname +(df $ x-1)* 2',並且'df $ newNumber'將成爲所需的輸出結果? – chappers

+0

@chappers感謝您的想法,但是我正在尋找一個通用的解決方案,我只是意識到我的x是順序的,可以通過這個解決,但x可以真的是任何值 – xyy

+0

擴展@chappers的想法,庫( data.table); setDT(df)[,gr:= .GRP,x] [,1:.N +(gr-1)* 2]#[1] 1 2 5 6 7 10 11 14 17 20 21 22 25 26' – akrun

回答

2

爲了擴大我的評論,分組可以是任意的,你只需要將它重新排列成正確的順序即可。有幾種方法可以做到這一點,@akrun已經表明,這可以使用match函數來完成,或者如果您更容易理解,可以使用as.numeric函數。

df <- data.frame(x=c(1,1,2,2,2,3,3,4,5,6,6,6,9,9),y=c(1,2,3,4,6,3,7,8,6,4,3,7,3,2)) 

# these are equivalent 
df$newx <- as.numeric(factor(df$x, levels=unique(df$x))) 
df$newx <- match(df$x, unique(df$x)) 

由於您現在有一個「新」順序的重新確認,我們可以使用評論中討論的邏輯。

df$newNumber <- 1:nrow(df) + (df$newx-1)*2 

在這個例子中,這將導致以下數據幀:

x y newx newNumber 
1 1 1   1 
1 2 1   2 
2 3 2   5 
2 4 2   6 
2 6 2   7 
3 3 3  10 
3 7 3  11 
4 8 4  14 
5 6 5  17 
6 4 6  20 
6 3 6  21 
6 7 6  22 
9 3 7  25 
9 2 7  26 

其中df$newNumber是你想要的輸出。


要創建序列0,0,4,4,4,9,...,基本上你在做什麼,走的是最小的各組和減去1。最簡單的方法是使用library(dplyr)

library(dplyr) 
df %>% 
    group_by(x) %>% 
    mutate(newNumber2 = min(newNumber) -1) 

這將有輸出:

Source: local data frame [14 x 5] 
Groups: x 

    x y newx newNumber newNumber2 
1 1 1 1   1   0 
2 1 2 1   2   0 
3 2 3 2   5   4 
4 2 4 2   6   4 
5 2 6 2   7   4 
6 3 3 3  10   9 
7 3 7 3  11   9 
8 4 8 4  14   13 
9 5 6 5  17   16 
10 6 4 6  20   19 
11 6 3 6  21   19 
12 6 7 6  22   19 
13 9 3 7  25   24 
14 9 2 7  26   24 
+0

謝謝chappers!我想知道你是否有其他天才的方法來從相同的數據中獲得序列「0,0,4,4,4,9,9,13,16,19,19,19,24,24」如上? – xyy

+0

看我的編輯。在Base R中可能有一種方法,但dplyr是我最初的想法。 – chappers