【问题标题】:Merge by multiple criteria and split out duplicates into separate columns?按多个条件合并并将重复项拆分为单独的列?
【发布时间】:2017-01-24 14:54:27
【问题描述】:

我很确定在某个时候有人问过这个问题并得到了回答,但我是一个新手,真的缺乏有效找到问题和解决方案的词汇。我有一个简单的任务,由于内部内存限制,我无法在 Excel 中执行,但我对 SQL 或 R 的了解不够,无法弄清楚如何在其中任何一个平台上执行。

我有两张表,一张有带有唯一 ID 号的唯一条目,另一张有这些 ID 号的多个副本,每个都显示不同的数字(代表职业生涯中的每个新薪水)。我正在尝试将每个薪水映射到原始的唯一 ID 表,为每个可能的更改创建新列 (Salary1:Salary50)。最终,我还需要绘制每个更改的日期和差异以进行分析。这是一个例子:

这是唯一的 ID 表:

Table 1                 
ID  Salary1 Salary2 Salary3 Salary4 Salary5
1   ?   ?   ?   ?   ?
2   ?   ?   ?   ?   ?
3   ?   ?   ?   ?   ?
4   ?   ?   ?   ?   ?
5   ?   ?   ?   ?   ?

这是带有重复 ID 的工资表和我想要的信息:

Table2      
ID  Salary  SalaryDate
1   10  1/1/2014
1   11  1/1/2015
1   12  1/1/2016
2   12  1/1/2015
2   13  1/1/2016
3   10  1/1/2016
4   10  1/1/2014
4   12  1/1/2015
4   14  1/1/2016
5   10  1/1/2016

最终状态应该是这样的:

Table3                  
ID  Salary1 Salary2 Salary3 Salary4 Salary5
1   10  11  12  0   0
2   12  13  0   0   0
3   10  0   0   0   0
4   10  12  0   0   0
5   10  0   0   0   0

我构建了一个多标准 Vlookup 以将所有内容提取到正确的列中,但数据集有超过 100,000 行要检查,因此它无法在内存方面完成它。谁能建议我如何在 Access、R、SPSS 中做同样的事情,或者我是否可以使用一些高效的 Excel-VBA 代码?

感谢您的帮助!

【问题讨论】:

    标签: r excel vba ms-access spss


    【解决方案1】:

    我不知道“Vlookup”是什么,但显然您正在寻找这样的东西:

    DF <- read.table(text = "ID  Salary  SalaryDate
                     1   10  1/1/2014
                     1   11  1/1/2015
                     1   12  1/1/2016
                     2   12  1/1/2015
                     2   13  1/1/2016
                     3   10  1/1/2016
                     4   10  1/1/2014
                     4   12  1/1/2015
                     4   14  1/1/2016
                     5   10  1/1/2016", header = TRUE)
    
    #years of employment assuming the table is sorted by dates
    DF$y <- ave(DF$ID, DF$ID, FUN = seq_along)
    
    #reshape
    library(reshape2)
    dcast(DF, ID ~ y, value.var = "Salary", fill = 0)
    #  ID  1  2  3
    #1  1 10 11 12
    #2  2 12 13  0
    #3  3 10  0  0
    #4  4 10 12 14
    #5  5 10  0  0
    

    请注意,这不是 R 中非常有用的数据格式。您的原始数据格式似乎对进一步分析更有用。

    【讨论】:

      【解决方案2】:

      假设 Table1 中的 ID 是 Table2 中 ID 的子集,我们只需要这些。此外,我们希望Salary1 结果列中的任何 ID 的第一个薪水,Salary2 结果列中的第二个薪水等等。首先计算 Seq,任何ID 中的第一个日期为 1,第二个为 2,依此类推。然后从这些序列号中创建一个因子,这些序列号的级别由表 1 中的 Salary 列标记。在最后一个语句子集Table2Table1ID 值(在显示的数据的情况下,它们是相同的,因此它没有任何影响)并使用xtabs 从长形式重塑为宽形式。没有使用任何包。

       Seq <- ave(1:nrow(Table2), Table2$ID, FUN = seq_along)
       Table0 <- Table1[-1] # Table0 is Table1 without ID column
       Table2$SalaryNo <- factor(Seq, levels = 1:ncol(Table0), labels = colnames(Table0))
       xtabs(Salary ~ ID + SalaryNo, data = subset(Table2, ID %in% Table1$ID))
      

      给予:

         Salary_No
      ID  Salary1 Salary2 Salary3 Salary4 Salary5
        1      10      11      12       0       0
        2      12      13       0       0       0
        3      10       0       0       0       0
        4      10      12      14       0       0
        5      10       0       0       0       0
      

      注意:这些表格不是以可重复的形式提供的,解决方案可能具体取决于它们是什么,所以我们假设:

      Lines1 <- "
      ID  Salary1 Salary2 Salary3 Salary4 Salary5
      1   ?   ?   ?   ?   ?
      2   ?   ?   ?   ?   ?
      3   ?   ?   ?   ?   ?
      4   ?   ?   ?   ?   ?
      5   ?   ?   ?   ?   ?"
      Table1 <- read.table(text = Lines1, header = TRUE)
      
      Lines2 <- "
      ID  Salary  SalaryDate
      1   10  1/1/2014
      1   11  1/1/2015
      1   12  1/1/2016
      2   12  1/1/2015
      2   13  1/1/2016
      3   10  1/1/2016
      4   10  1/1/2014
      4   12  1/1/2015
      4   14  1/1/2016
      5   10  1/1/2016"
      Table2 <- read.table(text = Lines2, header = TRUE)
      

      更新:相应地更改了假设和代码。还修复了一个错误(不影响显示的数据但可能影响其他数据)。

      【讨论】:

      • 我认为这几乎奏效了,但我收到了一个错误:model.frame.default 中的错误(公式 = Salary ~ Global.ID + SalaryNo,:可变长度不同(为 'SalaryNo' 找到)跨度>
      • 已修复。 (如果使用Note中的数据,该错误不影响答案。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 2023-03-22
      • 2018-04-10
      • 2021-11-25
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多