R:组合不同长度的数据帧而不回收值

时间:2016-06-25 20:42:01

标签: r merge

我正在尝试合并两个不同维度的数据框,但似乎无法获得我追求的结果。这是我想要实现的一个例子:

数据框A如下所示:

id        value
A         X
A         Y
A         Z
B         Y
C         X
C         Z

数据框B如下所示:

id        value
A         U
A         W
B         U
B         W
B         V
C         V

我正在尝试创建的数据框如下:

id        value.A        value.B
A         X              U
A         Y              W
A         Z              NA
B         Y              U
B         NA             W
B         NA             V
C         X              V
C         Z              NA

我一直在尝试将数据框与基本merge命令合并,但不断获取重复值,而不是NA。它似乎也扩展了结果数据框,以允许value.Avalue.B的唯一组合,我也不感兴趣。最后,并非数据框B中的所有ID都具有匹配的ID数据框A,在这种情况下,我希望value.B为该{1}}。

有没有办法通过NA实现我正在寻找的东西,还是我在寻找另一个(一组)命令?

编辑:

为了澄清,我确实尝试了各种连接组合,但仍然没有找到解决方案。

示例:

merge

产地:

A <- data.frame(id = c("A", "A", "A", "B", "C", "C"),
                value = c("X", "Y", "Z", "Y", "X", "Z"))

B <- data.frame(id = c("A", "A", "B", "B", "B", "C"),
                value = c("U", "W", "U", "W", "V", "V"))

merge(A, B, by="id", all=TRUE)

也就是说,数据框比我正在寻找的数据框大得多,因为数据帧A和B中的每对唯一值都会重复这些值。

编辑2:看起来我过多地简化了我的初始示例,所以为了澄清为什么我的值的顺序很重要,我将不得不稍微扩展原始示例:

数据框A如下所示:

id    value.x    value.y
A     X          U
A     X          W
A     Y          U
A     Y          W
A     Z          U
A     Z          W
B     Y          U
B     Y          W
B     Y          V
C     X          V
C     Z          V

数据框B如下所示:

id        value        rank
A         X            1
A         Y            0.5
A         Z            0.2
B         Y            1
C         X            1
C         Z            0.8

预期的数据框如下所示:

id        value        rank
A         U            1
A         W            0.6
B         U            1
B         W            0.2
B         V            0.1
C         V            1

2 个答案:

答案 0 :(得分:1)

这是我的幻想cbind。我创建了二级ID,假设数据是以相应的行排序的,而df2可能在每个id的df之前结束:

# add secondary IDs
df$idCnt <- rep_len(1L, length=nrow(df))
df$idCnt <- ave(df$idCnt, df$id, FUN=cumsum)

df2$idCnt <- rep_len(1L, length=nrow(df2))
df2$idCnt <- ave(df2$idCnt, df2$id, FUN=cumsum)

merge(df, df2, by=c("id", "idCnt"), all=TRUE)
id idCnt value.x value.y
1  A     1       X       U
2  A     2       Y       W
3  A     3       Z    <NA>
4  B     1       Y       U
5  B     2    <NA>       W
6  B     3    <NA>       V
7  C     1       X       V
8  C     2       Z    <NA>

以下是数据:

**data**
df <- read.table(header=T, text="id        value
A         X
A         Y
A         Z
B         Y
C         X
C         Z", stringsAsFactors=F)

df2 <- read.table(header=T, text="id        value
A         U
A         W
B         U
B         W
B         V
C         V", stringsAsFactors=F)

答案 1 :(得分:0)

你想在合并函数中使用'all'参数。

merge(a, b, all = TRUE)