R:按多个ID组合数据帧,如果匹配,则按第二个ID对齐,否则插入NA
我有两个字符串数据帧,如下所示R:按多个ID组合数据帧,如果匹配,则按第二个ID对齐,否则插入NA,r,join,merge,R,Join,Merge,我有两个字符串数据帧,如下所示 df1 firm_id user_id_source1 "1234" "abc" "1234" "bcd" "1234" "cde" "1234" "def" "1234" "fgh" "2345" "zyx" "2345" "yxw" "2345" "xwv" "2345" "wvu" "2345" "vut" 及 有许多公司都有许多用户ID。我希望在不丢失任何数据的情况下合
df1
firm_id user_id_source1
"1234" "abc"
"1234" "bcd"
"1234" "cde"
"1234" "def"
"1234" "fgh"
"2345" "zyx"
"2345" "yxw"
"2345" "xwv"
"2345" "wvu"
"2345" "vut"
及
有许多公司都有许多用户ID。我希望在不丢失任何数据的情况下合并用户id匹配的位置,然后合并其余数据,因为用户id的来源很重要。像这样:
result
firm_id user_id_source1 user_id_source2
"1234" "abc" "abc"
"1234" "bcd" "bcd"
"1234" "cde" NA
"1234" "def" NA
"1234" "fgh" NA
"1234" NA "ghi"
"1234" NA "hij"
"2345" "zyx" "zyx"
"2345" "yxw" "yxw"
"2345" "xwv" NA
"2345" "wvu" NA
"2345" "vut" NA
"2345" NA "utr"
我已经尝试了各种类型的连接和合并,但无法解决这个问题。非常感谢您的帮助。
多谢各位
编辑:下面的r-schifini解决了这个问题。非常感谢。
我补充说
library(dplyr)
df <- df %>% arrange(firm_id, is.na(user_id_source1), is.na(user_id_source2))
库(dplyr)
df%arrange(公司id,is.na(用户id\u源1),is.na(用户id\u源2))
按所需顺序排列
EDIT2:我已经在使用dplyr了,所以这对我来说不是问题,但我想可能有人想把它保留在base R中。下面是如何排序这是base R
df_ordered <- df[order(df$firm_id, is.na(df$user_id_source1), is.na(df$user_id_source2)),]
df_ordered您需要通过两列连接数据帧:firm_id
和user_id
(1和2)。由于user_id列具有不同的名称,并且您希望保留它们,请执行以下操作:
df1 = data.frame(firm_id = c('1234','1234','5678','5678'),user_id_1 = c('abc','bcd','abc','xyz'))
df2 = data.frame(firm_id = c('1234','3456','5678'),user_id_2 = c('abc','bcd','xyz'))
# Create a copy of the user_id columns with a common name: 'user'
df1$user = df1$user_id_1
df2$user = df2$user_id_2
# do a full merge (they will be merged by 'firm_id' and 'user')
df = merge(df1, df2, all = T)
# remove the 'user' column
df$user = NULL
结果:
> df1
firm_id user_id_1 user
1 1234 abc abc
2 1234 bcd bcd
3 5678 abc abc
4 5678 xyz xyz
> df2
firm_id user_id_2 user
1 1234 abc abc
2 3456 bcd bcd
3 5678 xyz xyz
> df
firm_id user_id_1 user_id_2
1 1234 abc abc
2 1234 bcd <NA>
3 5678 abc <NA>
4 5678 xyz xyz
5 3456 <NA> bcd
>df1
公司id用户id用户1用户
1234美国广播公司
21234 bcd bcd
35678美国广播公司
45678 xyz xyz
>df2
公司id用户\u id用户2
1234美国广播公司
23456 bcd bcd
35678 xyz xyz
>df
公司id用户id用户1用户id 2
1234美国广播公司
21234 bcd
35678美国广播公司
45678 xyz xyz
公元前53456年
您尝试过合并(df1,df2,by=“firm\u id”,all=TRUE)
吗?是的,这只是给出了每个firm\u id内的交叉积。非常简单。非常感谢。今天花了这么多时间在这件事上,我感到很尴尬。我添加了库(dplyr);df%arrange(公司id,is.na(用户id\u源1),is.na(用户id\u源2))
按所需顺序排列。
> df1
firm_id user_id_1 user
1 1234 abc abc
2 1234 bcd bcd
3 5678 abc abc
4 5678 xyz xyz
> df2
firm_id user_id_2 user
1 1234 abc abc
2 3456 bcd bcd
3 5678 xyz xyz
> df
firm_id user_id_1 user_id_2
1 1234 abc abc
2 1234 bcd <NA>
3 5678 abc <NA>
4 5678 xyz xyz
5 3456 <NA> bcd