我有两个数据框。这是一个例子:
x <- rep(c(0,1),3)
y <- c(1999,2000,2001,2002,2001,2002)
z <- data.frame(x,y)
x1 <- rep(0,12)
y1 <- c(1998,1999,1999,2000,1999,2001,1999,2000,2001,2002,2001,2002)
z1 <- data.frame(x1, y1)
基本上,newdf的计算方式是我们选择z的两行(行1和2)并按年份在帧z1中找到匹配项,然后选择z的后两行(行3和行4)并再次找到匹配项在z1中(按年份)。函数合并将执行匹配的所有可能组合,但是,我希望z的每两个连续行都不会重复两次。
newdf =(0 1999
0 2000
0 2001
0 2002
0 2001
0 2002)
任何建议都是宝贵的。
假设您要执行的操作是从中抓取两行z
,将它们匹配以z1
找到每个匹配的第一个符合条件的匹配,然后从z
和中删除已经匹配的行z1
,这是一个解决方案:
new.df <- data.frame(x=integer(), y=integer())
while(nrow(z) > 0) {
match.1 <- match(z$y[1], z1$y1)
match.2 <- match(z$y[2], z1$y1)
new.df <- rbind(new.df, z1[match.1, ], z1[match.2, ])
z <- z[-(1:2), ]
z1 <- z1[-c(match.1, match.2), ]
}
row.names(new.df) <- NULL
new.df
# x1 y1
# 1 0 1999
# 2 0 2000
# 3 0 2001
# 4 0 2002
# 5 0 2001
# 6 0 2002
这与您期望的输出匹配,但是由于所有x1
值均为0 ,因此您的期望输出是超级模棱两可的。如果您的第一列z1
具有更多可区分的值以帮助推断您想要的内容,那么会容易得多。
另外,如果其中的值z
不在中z1
,或者z
行数不为偶数,这将中断,但是我将添加逻辑以将其修复为您。此外,如果要对z
s执行此操作,则需要预先调整大小new.df
并替换为索引,而不是rbind
像我在此处所做的那样,因为那样会变得很慢。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句