【发布时间】:2016-12-22 11:09:21
【问题描述】:
我有两个 data.frames,它们有 3 列:
1. id - 唯一键
target- 分号分隔的唯一值source- 每个数据帧都相似,但两个data.frames 不同。
这是模拟数据:
set.seed(1)
df.1 <- data.frame(id=LETTERS[sample(length(LETTERS),10,replace=F)],
target=sapply(1:10,function(x) paste(LETTERS[sample(length(LETTERS),5,replace=F)],collapse=";")),
source="A",stringsAsFactors=F)
df.2 <- data.frame(id=LETTERS[sample(length(LETTERS),5,replace=F)],
target=sapply(1:5,function(x) paste(LETTERS[sample(length(LETTERS),5,replace=F)],collapse=";")),
source="B",stringsAsFactors=F)
我正在寻找一个可以将两个 data.frames 折叠在一起并创建 3 列的函数:
1.intersected.targets - 分号分隔的唯一值,它们在两个 data.frames 之间相交
2.source1.targets - 第一个 data.frame 独有的目标
3.source2.targets - 第二个data.frame独有的目标
因此,对于上面的示例,生成的 data.frame 将是:
> res.df
id intersected.targets sourceA.targets sourceB.targets
1 G NA F;E;Q;I;X <NA>
2 J NA M;R;X;I;Y <NA>
3 N NA Y;F;P;C;Z <NA>
4 U NA K;A;J;U;H <NA>
5 E NA M;O;L;E;S <NA>
6 S NA R;T;C;Q;J <NA>
7 W NA V;Q;S;M;L <NA>
8 M NA U;A;L;Q;P <NA>
9 B NA C;H;M;P;I <NA>
10 X NA <NA> G;L;S;B;T
11 H NA <NA> I;U;Z;H;K
12 Y NA <NA> L;R;J;H;Q
13 O NA <NA> F;R;C;Z;D
14 L V M;K;F;B X;J;R;Y
【问题讨论】:
-
您可以从
library(data.table) ; dcast(rbind(setDT(df.1), setDT(df.2)), id ~ source, value.var = "target")开始。不确定您在intersected.targets列中想要什么,因为您没有在所需的输出中指定它 -
你不需要这个修改(更不用说你的代码不起作用),因为你已经有一个通用的“V”了
-
对,对不起。相应地编辑
-
我猜@DavidArenburg 只是暂时删除了他的回复并正在对其进行编辑,如果是这种情况,我将建议他继续使用数据表方法,使用转换来列出源列的列和然后运行
setdiff, by=id。 -
@42- 不,我没有时间,如果有任何解决方案,您可以发布。
标签: r dataframe collapse aggregates