Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按多个条件合并并将重复项拆分为单独的列?_R_Excel_Vba_Ms Access_Spss - Fatal编程技术网

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

R 按多个条件合并并将重复项拆分为单独的列?,r,excel,vba,ms-access,spss,R,Excel,Vba,Ms Access,Spss,我很确定这个问题在某个时候已经被问到并得到了回答,但我是一个新手,确实缺乏有效地找到问题和解决方案的词汇。我有一个简单的任务,由于内部内存的限制,我无法在Excel中执行,但我对SQL或R的了解不够,无法弄清楚如何在这两个平台中执行 我有两个表,一个表有唯一的条目和唯一的ID号,另一个表有这些ID号的多个副本,每个都显示不同的数字(代表职业生涯中的每个新工资)。我试图将每个工资映射到原始的唯一ID表,为每个可能的更改创建新列(Salary1:Salary50)。最后,我还需要绘制每个变更的日期和

我很确定这个问题在某个时候已经被问到并得到了回答,但我是一个新手,确实缺乏有效地找到问题和解决方案的词汇。我有一个简单的任务,由于内部内存的限制,我无法在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
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
我构建了一个多标准Vlookup,将所有内容都拉到正确的列中,但是数据集要检查的行远远超过100000行,因此它无法在内存方面完成它。有谁能建议我如何在Access、R、SPSS中做同样的事情,或者我是否可以使用一些高效的Excel VBA代码

谢谢你的帮助

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

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
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

DF假设表1中的ID是表2中ID的子集,我们只需要这些ID。此外,我们还需要
Salary1
结果列中任何ID的第一个薪资,以及
Salary2
结果列中的第二个薪资,依此类推。第一个计算顺序,在任何
ID
中,第一个日期为1,第二个日期为2,依此类推。然后从这些序号中创建一个系数,这些序号的级别由表1中的薪资列标记。在最后一条语句中,将
表2
子集为
表1
ID
值(如果显示的数据相同,因此不会产生任何影响),并使用
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))
注意:表格不是以可复制的形式提供的,溶液可能具体取决于它们是什么,因此我们假设:

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)

Lines1我认为这几乎奏效了,但我得到了一个错误:model.frame.default(公式=Salary~Global.ID+SalaryNo,:可变长度差(为“SalaryNo”找到)中的错误已修复。(如果使用了注释中的数据,则错误不会影响答案。)