【发布时间】:2020-07-03 07:34:57
【问题描述】:
总结:我有两行代码使用 data.table 和 rbind 从一个表中获取任意行列表,将它们添加到另一个表中,然后从原始表中删除这些行.我试图通过从第三个表的列中绘制这些输入(源表、目标表、行列表)来使其工作。 IE 而不是(伪代码示例)table1<-rbind(table1, table2[list_of_rownums_to_copy]) 我想让它像table3$col1<-rbind(table3$col1, table3$col2[table3$col4]) 一样干净地工作,其中 col1 和 col2 的每一行都包含其他表的名称,而 col4 包含行号列表。这样,我可以将命令包装在一个函数中,并使用mapply 或类似方法自动运行它多次。
详细说明: 出于测试目的,我创建了 dtA 到 dtF 表。它们都具有相同的格式,每个表的行数不同。这里的空间是唯一的表 dtA 的前 6 行。其他表是一样的,只是在“orig_table”列而不是“a”列中有字母:
val orig_table ##dtA has "a" in this column, dtB has "b", etc
1 1 a
2 2 a
3 3 a
4 4 a
5 5 a
6 6 a
只要我手写所有内容并给出一个列表对象,以下两行代码就可以在任意两个选定的表上完美运行:
dtA<- rbind(dtA, dtB[list_of_row_numbers, ])
dtB<- dtB[ -list_of_row_numbers, ]
在这种情况下,dtA 是目标表,dtB 是源表,list_of_row_numbers 是一个列表对象,其中包含随机数,这些随机数作为要选择的行的行号。 IE 列表c(1, 3, 5) 会将表 dtB 中的第 1、3、5 行添加到表 dtA。第二行使用相同的列表来确定之后要从 dtB 中删除哪些行。与“剪切和粘贴”基本相同。
我所做的是创建另一个名为 dt1 的表,其中每一行是这两个命令的完整输入集。以下是head(dt1) 的输出供视觉参考:
V1 V2 V3 V4
1: dtA dtB 5804 3500,44228,22805,47866,32495,69006,...
2: dtA dtC 5637 59773,55783,73482,84333,57466,88604,...
3: dtA dtD 7292 67684,90789,67507,32937,90235,83391,...
4: dtA dtE 3321 16810,12906,40822,40316,52624,85656,...
5: dtA dtF 4268 89944,22578,23585,95320,79005,63923,...
6: dtB dtA 3219 46716,54828,11475,29245,76940, 2535,...
第一行的内容对应于我给出的手写命令示例。第 V1 列的第 1 行是目标表 (dtA),第 1 行第 V2 列是源表 (dtB),第 1 列第 V4 列是要处理的行的列表:
V1 V1 V2 V4
dtA<- rbind(dtA, dtB[list_of_row_numbers, ]) ## this copies rows from dtB to dtA
dtB<- dtB[ -list_of_row_numbers, ] ## this deletes them from dtB afterwards
我试图让它直接接受来自表 dt1 的输入。最终目标是将这两行包装在一个函数中以与mapply 一起使用,以便遍历整个表 dt1,使用每行中列出的输入执行每个操作。
问题是我无法弄清楚执行此操作的语法。我尝试简单地将dt1$V1 替换为dtA,如下所示,但它根本不起作用:
dt1$V1<- rbind(dt1$V1, dt1$V2[dt1[,V4])
dt1$V2<- dt1$V2[ -dt1[,V4], ]
我之前通过将输入包装在 eval(as.name(dt1$V1)) 中解决了一个类似的问题,它有一个不同的命令来正确地将 row1 col1 解释为对象的名称而不仅仅是文本,但它在这里不起作用。
【问题讨论】:
-
当然,我不确定你想要什么 dput。当我运行原始命令
dtA<- rbind(dtA, dtB[list_of_row_numbers, ])时会发生什么? -
我想就是这样。用最简单的术语来说:表 dtA 到 dtF 是我关心的数据,以及所有实际操作都在其中发生的表。我想将表 dt1 的每一行用作“说明”。所以表 dt1 中的第 1 行表示“将列 V4 中列出的所有行从列 V2 中命名的表中取出,并将它们放入列 V1 中命名的表中”。在此
dtB<- dtB[ -list_of_row_numbers, ]的末尾删除从原点移动的行。这就像 excel 中的“剪切和粘贴”。我在哪里可以找到更多关于为什么我的方法不起作用的信息?
标签: r function syntax data.table mapply