2017-08-31 57 views
0

我有一個名爲ID的列的數據框df。 多行可能具有相同的ID,我想設置一個列值「發生」以指示ID以前見過多少次。在R中設置數據框中行子集的列值

for (i in unique(df$ID)) { 
    rows = df[df$ID==i, ] 
    for (idx in 1:nrow(rows)) { 
     rows[idx,'occurrence'] = idx 
    } 
} 

不幸的是,這會將出現列添加到行,但它不會更新原始數據框。如何獲取添加到df的出現列?

更新:將ROW_NUMBER()函數中指出neilfws的偉大工程。其實,我有一個後續問題:數據框也有一個年份的列,我需要做的是添加一個新的列(比如Prev.Year.For.This.ID)爲上一次出現ID 。例如,如果輸入的是

Year = c(1991,1991,1993,1994,1995) 
ID = c(1,2,1,2,1) 
df <- data.frame (Year, ID) 

想我的輸出看起來像這樣:

ID Year occurrence Prev.Year.For.This.Id 
1 1991  1   <NA> 
2 1992  1   <NA> 
1 1993  2   1991 
2 1994  2   1992 
1 1995  3   1993 
+0

請提供樣本數據,使這個重複性。 – www

回答

3

您可以使用dplyrgroup_by ID,然後row_number給出發生次數的總數。

library(dplyr) 

df1 <- data.frame(ID = c(1,2,3,1,4,5,6,2,7,8,2)) 
df1 %>% 
    group_by(ID) %>% 
    mutate(cnt = row_number()) %>% 
    ungroup() 

     ID cnt 
    <dbl> <int> 
1  1  1 
2  2  1 
3  3  1 
4  1  2 
5  4  1 
6  5  1 
7  6  1 
8  2  2 
9  7  1 
10  8  1 
11  2  3 
+0

謝謝。我不知道'row_number()'是一件事情。 – lebelinoz

+0

我總是在dplyr中找到新的「東西」。花了我一段時間瞭解分組如何影響行數,但並不總是直觀。 – neilfws

+0

非常感謝非常優雅! – user1001630

2

你像下面後(我做了你的樣本數據):

library(dplyr) 
df = data.frame(ID = c(1,1,1,2,2,3)) 
answer = df %>% group_by(ID) %>% mutate(occurrence = cumsum(ID/ID) - 1) %>% as.data.frame 

這會給一些東西,看起來像這樣:

ID occurrence 
1  0 
1  1 
1  2 
2  0 
2  1 
3  0 

dplyr軟件包是分組和彙總數據的絕佳工具。當我使用管道%>%時,我也發現代碼非常易讀(儘管,不過,確實需要一些時間來適應)。

1
> library(data.table) 
> df = data.frame(ID = c(1,1,1,2,2,3)) 
> df <- data.table(df) 
> df[, occurrence := sequence(.N), by = c("ID")] 
> df 
    ID occurrence 
1: 1   1 
2: 1   2 
3: 1   3 
4: 2   1 
5: 2   2 
6: 3   1 
相關問題