重新排序(删除/更改顺序)数据框中的数据列

时间:2011-07-12 20:15:08

标签: r dataframe

我有两个大数据集,我正在尝试重新格式化旧数据集,使问题的顺序与新数据集的顺序相同(这样我就可以轻松地对每个相同的问题执行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崩溃而没有任何运气,想弄清楚如何使这项工作。

感谢您的帮助!

1 个答案:

答案 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的自我施加的时间限制。 :)