我正在尝试合并两个不同维度的数据框,但似乎无法获得我追求的结果。这是我想要实现的一个例子:
数据框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.A
和value.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
答案 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)