【问题标题】:Combine two data frames with different number of rows in R [duplicate]在R中组合两个具有不同行数的数据框[重复]
【发布时间】:2016-10-30 04:23:21
【问题描述】:

我有两个数据框,链接和正文:

链接是这样的:

wpt        ID
1          1235
mediate    4562
mediate    0928
2          6351
3          3826
mediate    0835

身体是这样的:

wpt   fuel    distance
1     2221    53927
2     4821    48261
3     8362    47151

我期望的输出是这样的:

wpt      fuel   distance   ID
1        2221   53927      1235
mediate  NA     NA         4562
mediate  NA     NA         0928
2        4821   48261      6351
3        8362   47151      3826
mediate  NA     NA         0835

我尝试使用“合并”功能,但没有成功。假设使用“mediate”的行号作为索引来拆分“body”并逐个绑定它们可能会起作用。有没有更好的好方法?看到有人可以在这里帮忙吗?

提前致谢!

【问题讨论】:

  • 如果merge 不起作用,我会再试一次,因为这对我来说似乎是一个典型的merge 问题。
  • merge(link, body, all = TRUE)
  • 我不这么认为,我希望带有“调解”的行在完全相同的位置。虽然合并会自动将它们放在一起。
  • 如果你想保持秩序,merge(link, body, all = TRUE)[order(link$wpt),]merge 有一个 sort 参数,您可以将其设置为 FALSE,但这里似乎没有遵守它。

标签: r dataframe merge reshape


【解决方案1】:
df1 <- data.frame(wpt = c(1, "meditate", "meditate", 2,3,"meditate"), 
              ID = c(1235, 4562, 0928,6351,3826,0835))
df1$wpt <- as.character(df1$wpt)


df2 <- data.frame(wpt = c(1,2,3), 
              fuel = c(1235, 4562, 0928), 
              distance = c(2,3,4))
df2$wpt <- as.character(df2$wpt)


library(dplyr)
full_join(df1, df2, by = "wpt")

不要介意价值观!您始终可以重新排列列。

       wpt   ID fuel distance
1        1 1235 1235        2
2 meditate 4562   NA       NA
3 meditate  928   NA       NA
4        2 6351 4562        3
5        3 3826  928        4
6 meditate  835   NA       NA

【讨论】:

  • 善意提醒,我希望带有“调解”的行在我在问题中指出的确切位置。或者这可以通过合并函数来完成。
  • 请检查我的编辑。冥想值在您想要的位置。
【解决方案2】:

我认为以下应该可行:

library(data.table)
setkey(link,wpt)
setkey(body,wpt)
merge(link,body,by="wpt",all.x=T)

【讨论】:

  • setkey 是一个data.table 函数。你需要library(data.table)
  • 你需要data.table
  • 很高兴知道不同的方法!
【解决方案3】:

这是一个围绕 match() 构建的非合并基础 R 解决方案:

link[names(body)[-1L]] <- body[match(link[,1L],body[,1L]),-1L];
link;
##       wpt   ID fuel distance
## 1       1 1235 2221    53927
## 2 mediate 4562   NA       NA
## 3 mediate 0928   NA       NA
## 4       2 6351 4821    48261
## 5       3 3826 8362    47151
## 6 mediate 0835   NA       NA

数据

link <- data.frame(wpt=c('1','mediate','mediate','2','3','mediate'),ID=c('1235','4562','0928'
,'6351','3826','0835'),stringsAsFactors=F);
body <- data.frame(wpt=c(1L,2L,3L),fuel=c(2221L,4821L,8362L),distance=c(53927L,48261L,47151L)
);

【讨论】:

  • 如果我可以建议,请将此答案移至欺骗目标。
【解决方案4】:

我们可以使用left_join

library(dplyr)
mutate(df2, wpt = as.character(wpt)) %>% 
                  left_join(df1, ., by = 'wpt')
#      wpt   ID fuel distance
#1       1 1235 2221    53927
#2 mediate 4562   NA       NA
#3 mediate  928   NA       NA
#4       2 6351 4821    48261
#5       3 3826 8362    47151
#6 mediate  835   NA       NA

或使用data.table

library(data.table)
setDT(df2)[, wpt := as.character(wpt)][df1, on = "wpt"]
#       wpt fuel distance   ID
#1:       1 2221    53927 1235
#2: mediate   NA       NA 4562
#3: mediate   NA       NA  928
#4:       2 4821    48261 6351
#5:       3 8362    47151 3826
#6: mediate   NA       NA  835

【讨论】:

  • 感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 2021-02-22
  • 2022-01-09
  • 2019-01-21
  • 1970-01-01
相关资源
最近更新 更多