【问题标题】:Add variable to group data by unique combinations of variables通过变量的唯一组合将变量添加到分组数据
【发布时间】:2019-07-13 06:17:20
【问题描述】:

我有一个如下的数据框:

df <- data.frame(cbind((c(2018,2018,2018,2018,2018,2017,2017,2016)), 
        (c('Ohio','Ohio','Arizona','Arizona','Nebraska','Nebraska','New Mexico','Idaho')), 
        (c('A','B','C','D','E','F','G','H')), (c(1,2,3,4,5,6,7,8))))
colnames(df) <- c('Date', 'Location', 'Var1', 'Var2')


      Date   Location     Var1 Var2
      2018   Ohio         A    1 
      2018   Ohio         B    2 
      2018   Arizona      C    3 
      2018   Arizona      D    4 
      2018   Nebraska     E    5 
      2017   Nebraska     F    6 
      2017   New Mexico   G    7 
      2016   Idaho        H    8 

我正在尝试引入一个新变量“Combo”,它将代表“日期”和“位置”变量的每个唯一组合,这样任何共享相同日期和位置的观察行都将具有相同的 '组合的价值。我希望它看起来像这样:

      Date   Location     Var1 Var2  Combo
      2018   Ohio         A    1     1
      2018   Ohio         B    2     1
      2018   Arizona      C    3     2
      2018   Arizona      D    4     2
      2018   Nebraska     E    5     3
      2017   Nebraska     F    6     4
      2017   New Mexico   G    7     5
      2016   Idaho        H    8     6

这样每个组合值都由具有相同日期和位置组合的所有行共享,而与该行中的其他变量无关。

我尝试使用mutate()distinct() 的组合,但没有成功。我希望有一个简单的解决方案,有点类似于:

有人对此有任何想法吗?我已经尝试在 distinct()unique() 的文档中查找想法,但没有运气。

非常感谢任何帮助!

【问题讨论】:

  • 基本 R 函数 interaction() 可能是您想要的,它返回一个您可以强制转换为整数的因子。
  • 或者干脆df %&gt;% mutate(Combo = group_indices(., Date, Location))

标签: r tidyr data-manipulation dplyr


【解决方案1】:

我们可以使用data.table中的.GRP,在按“日期”、“位置”分组后

library(data.table)
setDT(df)[, Combo := .GRP, .(Date, Location)]
df
#   Date   Location Var1 Var2 Combo
#1: 2018       Ohio    A    1     1
#2: 2018       Ohio    B    2     1
#3: 2018    Arizona    C    3     2
#4: 2018    Arizona    D    4     2
#5: 2018   Nebraska    E    5     3
#6: 2017   Nebraska    F    6     4
#7: 2017 New Mexico    G    7     5
#8: 2016      Idaho    H    8     6

或使用rleid

setDT(df)[, Combo := rleid(Date, Location)]

【讨论】:

    【解决方案2】:

    两者

    df <- mutate(df,Combo = as.integer(interaction(Date,Location,drop = TRUE)))
    

    df <- mutate(df,Combo = as.integer(factor(paste0(Date,Location))))
    

    是选项,尽管它们对级别进行排序而不是按照它们在数据中出现的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2021-09-25
      相关资源
      最近更新 更多