объединение двух фреймов данных с разными именами строк в R

#r #dataframe #merge

#r #фрейм данных #слияние

Вопрос:

У меня есть два фрейма данных, и я хочу объединить их по именам строк. Но имена строк не равны, я пробовал это, но это не работает

 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
  

Я отредактировал свои данные примера, потому что понял, что они не соответствуют реальным данным должным образом.

Комментарии:

1. Что вы пытаетесь сделать с этой строкой T ~ name ? Нет name значения для присвоения. Можете ли вы показать ожидаемый результат?

Ответ №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
  

Если данные не совпадают с post и нет шаблона, который мы могли бы использовать для сопоставления 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')
  

Комментарии:

1. Спасибо @Ronak за ваше решение, имена столбцов правильные, но, к сожалению, «Данные недоступны».

2. Вы вернули данные обратно? df <- df1 %>% rownames_to_column....rest of the code

3. Да, я сделал… Я думаю, что это как-то связано с моим gsub

4. Используете ли вы те же данные, что показаны в вашем сообщении? У меня это работает без каких-либо ошибок в этих данных. Если ваши реальные данные не такие, как в вашем сообщении, вы также можете использовать case_when для замены значений по отдельности. Проверьте обновленный ответ.

5. Нет, это был повторный запрос. ...mutate(name1 = gsub('^ST|\.','', name)) %>% mutate(name1 = gsub('.0U', '.U', name)) %>%... Я подозреваю, что это неверно, когда я хочу заменить более одной вещи…