【问题标题】:merging two data.frames by different row.names in R在R中通过不同的row.names合并两个data.frames
【发布时间】:2020-08-29 07:44:11
【问题描述】:

我有两个 data.frames,我想通过 row.names 将它们连接在一起。但是 row.names 不相等,我试过了,但它不起作用

df1 <- data.frame(row.names = c('S.5.0U0','S.6.0U1','S.7.0U2','S.8.0U3'),vara=c(-1.2,15,8.5,0),varb=c(-29,29,2.6,5))
df2 <- data.frame(row.names = c('5U','6U','7U'),var1=c(-0.5,1.5,58),var2=c(-2.09,-12,2.6))

df1
      vara  varb
S.5.0U0 -1.2 -29.0
S.6.0U1 15.0  29.0
S.7.0U2  8.5   2.6
S.8.0U3  0     5

df2
   var1   var2
5.U0 -0.5  -2.09
6.U1  1.5 -12.00
7.U2 58.0   2.60

merge <- df1 %>% mutate(name = case_when(
         name == 'S.5.U' ~ '5U',
         name == 'S.6.U' ~ '6U',
         name == 'S.7.U' ~ '7U',
T ~ name)) %>% 
  left_join(., df2, by = 'name')

Error:Problem with `mutate()` input `name`. x Objekt 'name' not found i Input `name` is `case_when(...)`.

为什么这不起作用?为什么我指定了name却找不到?

编辑: 输出应该是这样的

merge
          vara  varb var1  var2
S.5.0U0 5U  -1.2   -29 -0.5   -2.09
S.6.0U1 6U   15     29  1.5   -12
S.7.0U2 7U   8.5   2.6  58    2.6

我编辑了我的示例数据,因为我意识到它不适合真实数据。

【问题讨论】:

  • 你想用这条线做什么T ~ name?没有要分配的 name 值。你能展示你的预期输出吗?

标签: r dataframe merge


【解决方案1】:

name 列不存在于您的数据中,您将它们作为行名。将行名设为列,使用 gsub 从中删除不需要的字符,然后加入数据。

library(dplyr)
library(tibble)

df1 %>%
  rownames_to_column('name') %>%
  mutate(name1 = gsub('[S.0]|\\d$', '', name)) %>%
  inner_join(df2 %>%
  rownames_to_column('name'), by = c('name1' = 'name')) %>%
  column_to_rownames('name')

#        vara  varb name1 var1   var2
#S.5.0U0 -1.2 -29.0    5U -0.5  -2.09
#S.6.0U1 15.0  29.0    6U  1.5 -12.00
#S.7.0U2  8.5   2.6    7U 58.0   2.60

如果数据与帖子不同,并且没有可用于匹配 name 值的模式,我们也可以使用 case_when 单独匹配值。

df1 %>%
  rownames_to_column('name') %>%
  mutate(name1 = case_when(name == 'S.5.U' ~ '5U',
    name == 'S.6.U' ~ '6U',
    name == 'S.7.U' ~ '7U',
    name == 'S.8.U' ~ '8U',
    TRUE ~ name)) %>%  
  inner_join(df2 %>% rownames_to_column('name'), by = c('name1' = 'name')) %>%
  column_to_rownames('name')

【讨论】:

  • 谢谢@Ronak 你的解决方案,列名是正确的,但不幸的是'没有可用的数据'。
  • 您是否分配回数据? df &lt;- df1 %&gt;% rownames_to_column....rest of the code
  • 是的,我做了...我认为这与我的gsub
  • 您使用的数据是否与您的帖子中显示的相同?它对我有用,并且该数据没有任何错误。如果您的真实数据与您的帖子中的不同,您还可以使用case_when 单独替换值。检查更新的答案。
  • 不,这是一个代表。 ...mutate(name1 = gsub('^ST|\\.','', name)) %&gt;% mutate(name1 = gsub('.0U', '.U', name)) %&gt;%... 我怀疑当我想替换多个东西时这是不正确的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 2021-03-08
  • 2019-03-28
相关资源
最近更新 更多