我有一个带有名为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
答案 0 :(得分:3)
您可以使用dplyr
到group_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