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