Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:按多个ID组合数据帧,如果匹配,则按第二个ID对齐,否则插入NA_R_Join_Merge - Fatal编程技术网

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