R - 如何在我的数据集中为特定组运行重复?

时间:2016-07-12 21:36:02

标签: r rows

我有一个数据框,其中包含在不同公司工作的人员的大量重复个人ID。

我希望将 重复的 用于每个不同公司的每个不同季度的个人ID。

Example of what my data looks like

基本上,我希望R只针对公司1的第1季度内的ids运行 重复 ,然后针对公司1的第2季度,然后针对公司的第3季度1等等,直到公司1的代码完成,然后继续前进到公司2,在公司2再次运行第2季的公司2等等。

Example of the desired result

我的主要问题是:如果A人出现在多个不同的季度或多个公司,那么他/她的ID第一次出现在每个季度/公司 应该 NOT 被视为重复值。

任何意见都会得到极大的赞赏,我会确保迅速做出任何可能需要的澄清。谢谢。

1 个答案:

答案 0 :(得分:0)

使用便于分组的任何软件包都可以轻松完成,例如" data.table"或" dplyr"。

示例:

library(data.table)
as.data.table(mydf)[, duplicates := duplicated(id), .(firm)][]
#     firm quarter id duplicates
#  1:    1       1  A      FALSE
#  2:    1       2  B      FALSE
#  3:    1       3  A       TRUE
#  4:    1       4  C      FALSE
#  5:    1       5  B       TRUE
#  6:    2       1  A      FALSE
#  7:    2       1  B      FALSE
#  8:    2       2  B       TRUE
#  9:    3       1  D      FALSE
# 10:    3       2  E      FALSE
# 11:    3       2  F      FALSE
# 12:    3       3  E       TRUE
# 13:    4       1  A      FALSE
# 14:    4       1  C      FALSE

library(tidyverse)
mydf %>% 
  group_by(firm) %>% 
  mutate(duplicates = duplicated(id))
# # A tibble: 14 x 4
# # Groups:   firm [4]
#     firm quarter id    duplicates
#    <dbl>   <dbl> <chr> <lgl>     
#  1  1.00    1.00 A     F         
#  2  1.00    2.00 B     F         
#  3  1.00    3.00 A     T         
#  4  1.00    4.00 C     F         
#  5  1.00    5.00 B     T         
#  6  2.00    1.00 A     F         
#  7  2.00    1.00 B     F         
#  8  2.00    2.00 B     T         
#  9  3.00    1.00 D     F         
# 10  3.00    2.00 E     F         
# 11  3.00    2.00 F     F         
# 12  3.00    3.00 E     T         
# 13  4.00    1.00 A     F         
# 14  4.00    1.00 C     F 

或者,在基础R:

within(mydf, {
  duplicates = ave(id, firm, FUN = duplicated)
})

示例数据:

mydf <- structure(list(firm = c(1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 
    4), quarter = c(1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 2, 3, 1, 1), id = c("A", 
    "B", "A", "C", "B", "A", "B", "B", "D", "E", "F", "E", "A", "C"
    )), .Names = c("firm", "quarter", "id"), row.names = c(NA, 14L
    ), class = "data.frame")