设置R中数据框中行子集的列值

时间:2017-08-31 05:25:37

标签: r dataframe

我有一个带有名为ID的列的数据帧df。 多行可能具有相同的ID,我想设置一个列值“occurrence”,以指示之前看过ID的次数。

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

不幸的是,这会将出现列添加到行,但不会更新原始数据框。如何将出现列添加到df?

更新:neilfws指出的row_number()函数效果很好。实际上,我有一个后续问题:数据框也有一个年级列,我需要做的是为上一次出现ID的年份添加一个新列(比如Prev.Year.For.This.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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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包是分组和汇总数据的绝佳工具。当我使用管道%>%时,我也发现代码非常易读(尽管如此,它确实需要一些时间来习惯)。

答案 2 :(得分:1)

-dontwarn