我有两个大数据集,我正在尝试重新格式化旧数据集,使问题的顺序与新数据集的顺序相同(这样我就可以轻松地对每个相同的问题执行t检验以跟踪重大变化数据集之间的2年)。从旧版本更改时,新版本已删除并添加了问题。
我一直在努力做到这一点的方式,R因为我认为矢量太大而不断崩溃。但是,我不确定它们是如何成为这么大的!以下是我正在做的事情:
两个数据集都具有相同的格式。原始套装为新款415件,旧款418件。我想将新数据集的前大约158个列与旧数据集匹配。每个数据集的列名为q1-q415,每列中的数据为数字1-5或NA。每个问题/列大约有100个答案,旧数据集有更多响应者(旧的140行,新的114行)。下面是一个例子(但请记住,整个集合中有超过400列,超过100行!)
以下是data.old的示例。 data.new看起来只相同data.new有更多行数/ na答案。在这里,我显示问题1到20和前10行。 data.old = 418列(q1到q418)x 140行 data.new = 415列(q1到q415)x 114行 我需要将data.old的前170个COLUMNS与data.new的前157个列相匹配 为此,我将删除data.old中的17个列(data.old调查问卷中的问题,并从data.new调查表中删除),还要向data.old添加7个新列(其中包含NAs ..对于data.new有新问题的地方持有人,data.old问卷中没有这些问题。
>data.old
q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20
1 3 4 3 3 5 4 1 NA 4 NA 1 2 NA 5 4 3 2 3 1
3 4 5 2 2 4 NA 1 3 2 5 2 NA 3 2 1 4 3 2 NA
2 NA 2 3 2 1 4 3 5 1 2 3 4 3 NA NA 2 1 2 5
1 2 4 1 2 5 2 3 2 1 3 NA NA 2 1 5 5 NA 2 3
4 3 NA 2 1 NA 3 4 2 2 1 4 5 5 NA 3 2 3 4 1
5 2 1 5 3 2 3 3 NA 2 1 5 4 3 4 5 3 NA 2 NA
NA 2 4 1 5 5 NA NA 2 NA 1 3 3 3 4 4 5 5 3 1
4 5 4 5 5 4 3 4 3 2 5 NA 2 NA 2 3 5 4 5 4
2 2 3 4 1 5 5 3 NA 2 1 3 5 4 NA 2 3 4 3 2
2 1 5 3 NA 2 3 NA 4 5 5 3 2 NA 2 3 1 3 2 4
所以在新的集合中,一些问题被删除,一些新的问题被添加,一些更改了顺序,所以我按顺序创建了旧数据的子集,我需要再次将它们组合起来以匹配新数据集。当旧数据集中不存在问题时,我想在新数据集中使用该问题,以便我可以(理论上)在一个大循环中执行我的t检验。
dataold.set1 <- dataold[1:16]
dataold.set2 <- dataold[18:19]
dataold.set3 <- dataold[21:23]
dataold.set4 <- dataold[25:26]
dataold.set5 <- dataold[30:33]
dataold.set6 <- dataold[35:36]
dataold.set7 <- dataold[38:39]
dataold.set8 <- dataold[41:42]
dataold.set9 <- dataold[44]
dataold.set10 <- dataold[46:47]
dataold.set11 <- dataold[49:54]
dataold.set12 <- datanew[43:49]
dataold.set13 <- dataold[62:85]
dataold.set14 <- dataold[87:90]
dataold.set15 <- datanew[78]
dataold.set16 <- dataold[91:142]
dataold.set17 <- dataold[149:161]
dataold.set18 <- dataold[55:61]
dataold.set19 <- dataold[163:170]
然后我试图将列重新组合成一组 我试过了两个
dataold.adjust <- merge(dataold.set1, dataold.set2)
dataold.adjust <- merge(dataold.adjust, dataold.set3)
dataold.adjust <- merge(dataold.adjust, dataold.set4)
我也试过
dataold.adjust <- cbind(dataold.set1, dataold.set2, dataold.set3)
但是,每次我尝试执行这些功能时,R会冻结,然后崩溃。我设法让它显示错误一次,它说它无法使用10 Mb的矢量,然后我得到多个涉及超过1000 Mb向量的错误。我不确定我的向量是多么大,当它被第3组崩溃时,它只是表中的23列数据,而我通常使用的数据集长度超过400列。 / p>
还有另一种方法可以做到这一点,不会导致我的程序崩溃并出现内存问题(并且不需要我输入超过100列的列名),或者这里有一些代码元素我错过了我得到内存接收器的地方?我一直试图解决这个问题,花了一个小时来处理R崩溃而没有任何运气,想弄清楚如何使这项工作。
感谢您的帮助!
答案 0 :(得分:5)
您正在制作大量不必要的数据副本,然后您正在增长最终对象(dataold.adjust
)。您只需要一个正确排序列的向量:
cols1 <- c(1:16,18:19,21:23,25:26,30:33,35:36,38:39,41:42,44,46:47,49:54)
cols2 <- c(62:85,87:90)
cols3 <- c(91:142,149:161,55:61,163:170)
# merge old / new data by row and add NA for unmatched rows
dataold.adjust <- merge(data.old[,c(cols1,cols2,cols3)],
data.new[,c(43:49,78)], by="row.names", all=TRUE)
# put columns in desired order
dataold.adjust <- dataold.adjust[,c(1:length(cols1), # 1st cols from dataold
ncol(dataold.adjust)-length(43:49):1, # 1st cols from datanew
(length(cols1)+1):length(cols2), # 2nd cols from dataold
ncol(dataold.adjust), # 2nd cols from datanew
(length(cols1)+length(cols2)+1):length(cols3))] # 3rd cols from dataold
最后一部分是一个绝对的kludge,但我今天达到了SO的自我施加的时间限制。 :)