Как объединить два кадра данных с одинаковым именем столбца, но могут иметь одинаковые данные в переменных в R? - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу спросить, как объединить эти два фрейма данных?

df1:

Name   Type   Price
A       1      NA
B       2      2.5
C       3      2.0

df2:

Name   Type   Price
A       1      1.5
D       2      2.5
E       3      2.0

Как видно из обоих df, они имеют одинаковые имена столбцов и одну строку с одинаковым значением в «Name», которое равно A, но df1 не имеет цены, тогда как df2 имеет. Я хочу добиться этого вывода так, чтобы они сливались, если значение в «Имя» одинаково

Name   Type   Price
A       1      1.5
B       2      2.5
C       3      2.0
D       2      2.5
E       3      2.0

Ответы [ 3 ]

0 голосов
/ 08 апреля 2020

Похоже, вы хотите связать вместе фреймы данных, а затем удалить строки со значениями NA для Price и упорядочить по имени.

library(data.table)

setDT(rbind(df1, df2))[!is.na(Price)][order(Name)]
#    Name Type Price
# 1:    A    1   1.5
# 2:    B    2   2.5
# 3:    C    3   2.0
# 4:    D    2   2.5
# 5:    E    3   2.0
0 голосов
/ 08 апреля 2020

Вот базовое решение R с использованием merge + ocmplete.cases

dfout <- subset(u <- merge(df1,df2,all= TRUE),complete.cases(u))

, что дает

> dfout
  Name Type Price
1    A    1   1.5
3    B    2   2.5
4    C    3   2.0
5    D    2   2.5
6    E    3   2.0

ДАННЫЕ

df1 <- structure(list(Name = structure(1:3, .Label = c("A", "B", "C"
), class = "factor"), Type = 1:3, Price = c(NA, 2.5, 2)), 
class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(Name = structure(1:3, .Label = c("A", "D", "E"
), class = "factor"), Type = 1:3, Price = c(1.5, 2.5, 2)), 
class = "data.frame", row.names = c(NA, -3L))
0 голосов
/ 08 апреля 2020

Мы могли бы сделать full_join на df1 и df2 на Name, а с помощью coalesce на Type и Price получить первое не-NA значение из этих столбцов.

library(dplyr)

full_join(df1, df2, by = 'Name') %>%
   mutate(Type = coalesce(Type.x, Type.y), 
          Price = coalesce(Price.x, Price.y)) %>%
   select(names(df1))

#  Name Type Price
#1    A    1   1.5
#2    B    2   2.5
#3    C    3   2.0
#4    D    2   2.5
#5    E    3   2.0

и аналогичные в базе R:

transform(merge(df1, df2, by = 'Name', all = TRUE), 
           Price = ifelse(is.na(Price.x), Price.y, Price.x), 
           Type = ifelse(is.na(Type.x), Type.y, Type.x))[names(df1)]

данные

df1 <- structure(list(Name = structure(1:3, .Label = c("A", "B", "C"
), class = "factor"), Type = 1:3, Price = c(NA, 2.5, 2)), 
class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(Name = structure(1:3, .Label = c("A", "D", "E"
), class = "factor"), Type = 1:3, Price = c(1.5, 2.5, 2)), 
class = "data.frame", row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...