在 R 中按行和按列合并数据帧
Merging data frames row-wise and column-wise in R
如何合并两个数据框,一个按列,另一个按行?例如,我有两个这样的数据框:
A: add1 add2 add3 add4
1 k NA NA NA
2 l k NA NA
3 j NA NA NA
4 j l NA NA
B: age size name
1 5 6 x
2 8 2 y
3 1 3 x
4 5 4 z
我想通过 row.name 合并两个 data.frames。但是,我想按列而不是按行合并 data.frame A。所以,我正在寻找这样的 data.frame 结果:
C:id age size name add
1 5 6 x k
2 8 2 y l
2 8 2 y k
3 1 3 x j
4 5 4 z j
4 5 4 z l
例如,假设你有 table B 中的人的信息,包括姓名、大小等。这些信息是唯一值,因此你在 B 中每个人一行。然后,假设在 table A,你最多有5个过去的地址。第一列是最近的地址;第二,是第二个最近的地址;等等。现在,如果某人的地址少于 5 个(例如 3 个),则该人的第 4 列和第 5 列中有 NA。
我想要实现的是一个包含所有这些信息的数据框 (C)。因此,对于有两个地址的人,我需要 table C 中的两行,重复唯一值并且仅在列地址中有所不同。
我正在考虑按非 NA 值的数量重复 A 数据框的行,同时保持 row.name 与它们相同(如数据框 D),然后合并新的与 B 的数据框。但我不确定如何执行此操作。
D: address
1 k
2 l
2 k
3 j
4 j
4 l
谢谢!
把第一个data.frame改成长格式,就简单了。 df1是A,df2是B。我也把数字命名为id。
require(tidyr)
# wide to long (your example D)
df1tidy <- gather(df1,addname,addval,-id)
# don't need the original add* vars or NA's
df1tidy$addname <- NULL
df1tidy <- df1tidy[!is.na(df1tidy$addval), ]
# merge them into the second data.frame
merge(df2,df1tidy,by = 'id',all.x = T)
如何合并两个数据框,一个按列,另一个按行?例如,我有两个这样的数据框:
A: add1 add2 add3 add4
1 k NA NA NA
2 l k NA NA
3 j NA NA NA
4 j l NA NA
B: age size name
1 5 6 x
2 8 2 y
3 1 3 x
4 5 4 z
我想通过 row.name 合并两个 data.frames。但是,我想按列而不是按行合并 data.frame A。所以,我正在寻找这样的 data.frame 结果:
C:id age size name add
1 5 6 x k
2 8 2 y l
2 8 2 y k
3 1 3 x j
4 5 4 z j
4 5 4 z l
例如,假设你有 table B 中的人的信息,包括姓名、大小等。这些信息是唯一值,因此你在 B 中每个人一行。然后,假设在 table A,你最多有5个过去的地址。第一列是最近的地址;第二,是第二个最近的地址;等等。现在,如果某人的地址少于 5 个(例如 3 个),则该人的第 4 列和第 5 列中有 NA。
我想要实现的是一个包含所有这些信息的数据框 (C)。因此,对于有两个地址的人,我需要 table C 中的两行,重复唯一值并且仅在列地址中有所不同。
我正在考虑按非 NA 值的数量重复 A 数据框的行,同时保持 row.name 与它们相同(如数据框 D),然后合并新的与 B 的数据框。但我不确定如何执行此操作。
D: address
1 k
2 l
2 k
3 j
4 j
4 l
谢谢!
把第一个data.frame改成长格式,就简单了。 df1是A,df2是B。我也把数字命名为id。
require(tidyr)
# wide to long (your example D)
df1tidy <- gather(df1,addname,addval,-id)
# don't need the original add* vars or NA's
df1tidy$addname <- NULL
df1tidy <- df1tidy[!is.na(df1tidy$addval), ]
# merge them into the second data.frame
merge(df2,df1tidy,by = 'id',all.x = T)