【问题标题】:Substitute duplicates with different variables用不同的变量替换重复项
【发布时间】:2020-12-08 18:31:55
【问题描述】:

我正在尝试执行以下操作。在我的面板数据集中,我观察了一个不同年龄的人。虽然数据不精确,所以我可能会在不同年份重复一个人的相同年龄(例如 [id=1, year=2000, age=40] 和 [id=1, year=2001, age=40]。我想识别这些观察结果并将它们替换为不同的变量,对应于“年份”-“出生年份”。

所以我有类似的东西:

id year age year_birth age_dv
1 2000 40 1960 40
1 2001 40 1960 41
1 2002 42 1960 42

我想替换为:

id year age year_birth age_dv
1 2000 40 1960 40
1 2001 41 1960 41
1 2002 42 1960 42

我之前在 Stata 中做过这个,我会创建一个列,根据 id 和 age 标识重复项(例如,如果它是重复项,则为 1)并使用这个新的“标签”列上的条件替换这些变量。

最终结果如下:

id year age year_birth age_dv duplicate
1 2000 40 1960 40 0
1 2001 41 1960 41 1
1 2002 42 1960 42 0

我可以在 R 中做同样的事情吗?还是有更好的办法?

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    data.table 的选项是

    library(data.table)
    setDT(df)[, c('duplicate', 'age') := .(+(duplicated(age)), 
            year - year_birth), .(id)]
    df
    #   id year age year_birth age_dv duplicate
    #1:  1 2000  40       1960     40         0
    #2:  1 2001  41       1960     41         1
    #3:  1 2002  42       1960     42         0
    

    数据

    df <- structure(list(id = c(1L, 1L, 1L), year = 2000:2002, age = c(40L, 
    40L, 42L), year_birth = c(1960L, 1960L, 1960L), age_dv = 40:42), 
    class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

    • 谢谢!如果我在我的数据上尝试它虽然它报告以下错误“:=(c("duplicate", "age2"), .(+(duplicated(age)), year - year_birth)) 中的错误:检查是.data.table(DT) == TRUE。否则,:= 和 :=(...) 被定义为在 j 中使用,仅一次且以特定方式使用。请参阅 help(":=")。"跨度>
    • @Maria 这个错误是因为你的数据集不是data.frame。我使用 setDT 将 data.frame 转换为 data.table
    • 好吧有道理。之后我应该将其设置回数据框吗?
    • @Maria 可以,你可以用setDF改回data.frame,不过用data.table效率更高
    【解决方案2】:

    dplyr 你可以使用

    library(dplyr)
    dd %>% 
      group_by(id) %>% 
      mutate(duplicate=duplicated(age)+0,
             age = year-year_birth)
    

    经过测试

    dd <- read.table(text="
    id  year    age year_birth  age_dv
    1   2000    40  1960    40
    1   2001    40  1960    41
    1   2002    42  1960    42", header=TRUE)
    

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 2014-01-09
      • 2013-04-24
      • 2018-07-28
      • 2020-11-10
      • 1970-01-01
      • 2019-01-09
      • 2011-10-04
      • 1970-01-01
      相关资源
      最近更新 更多