按多个条件合并并将重复项拆分为单独的列?

时间:2017-01-24 14:54:27

标签: r excel excel-vba access spss vba

我很确定这个问题已在某个时候被提出并得到解答,但我是一个新手,并且缺乏有效找到问题和解决方案的词汇。我有一个简单的任务,由于内部内存限制,我无法在Excel中执行,但我对SQL或R的了解不足以弄清楚如何在这两个平台中执行此操作。

我有两个表,一个有唯一ID号的唯一条目,另一个有这些ID号的多个副本,每个表示不同的数字(代表职业过程中的每个新工资)。我试图将每个工资映射到原始唯一ID表,为每个可能的更改创建新列(Salary1:Salary50)。最后,我还需要映射每个变化的日期和差异以进行分析。这是一个例子:

这是唯一的ID表:

<hot-table id="demoTable"
           colHeaders="true"
           datarows="gridData"
           settings="gridPreferences"
           height="300">

    <!-- BasicData -->
    <hot-column data="row_id" title="'ID'" type="'text'"></hot-column>

这里是薪资表,其中包含重复的ID和我想要的信息:

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

最终状态应如下所示:

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分: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中非常有用的数据格式。您的原始数据格式对于进一步分析似乎更有用。

答案 1 :(得分:1)

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

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

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