У меня есть два набора данных, которые были импортированы. Второй набор данных имеет только один столбец, который соответствует 44 из 86 строк в первом наборе данных. Как я могу сформировать новый набор данных, который включает только данные строк, которые появляются в обоих наборах данных. Имена столбцов разные.
Я не в состоянии публиковать используемые данные, код ниже соответствует тем же принципам, но не совсем то же самое. Однако, поскольку я пытаюсь выбрать 44 строки, выбор строк невозможен.
дф1:
Fruit Circumference Weight
Apple 10 20
Orange 13 30
Pear 10 21
Kiwi 7 15
Cherry 3 10
Strawberry 4 13
Blueberry 2 5
дф2:
Fruit Name
Orange
Cherry
Blueberry
Новые данные:
Fruit Circumference Weight
Orange 13 30
Cherry 3 10
Blueberry 2 5
Мы можем использовать inner_join
. У него также есть возможность проверять только выбранные столбцы с аргументом by
.
library(dplyr)
inner_join(df1, df2)
Или еще вариант intersect
от dplyr
intersect(df1, df2)
С опубликованными данными это будет
inner_join(df1, df2, by = c("Fruit" = "Fruit Name"))
@Sabrina Возможно, вам придется установить имена одного набора данных с именем другого, то есть inner_join(df1, setNames(df2, names(df1)))
(при условии, что столбцы находятся в том же порядке)
@Sabrina Или вы можете указать опцию by
в inner_join
, т.е. inner_join(df1, df2, by = setNames(names(df2), names(df1)))
Вот три базовых способа R.
Обратите внимание, что имя второго столбца data.frame содержит пробел. Поэтому имя столбца должно быть между обратными кавычками в первых двух случаях, а в третьем аргументе используются by.x
и by.y
.
df1[df1$Fruit %in% df2$`Fruit Name`, ]
# Fruit Circumference Weight
#2 Orange 13 30
#5 Cherry 3 10
#7 Blueberry 2 5
df1[match(df2$`Fruit Name`, df1$Fruit), ]
# Fruit Circumference Weight
#2 Orange 13 30
#5 Cherry 3 10
#7 Blueberry 2 5
merge(df1, df2, by.x = "Fruit", by.y = "Fruit Name")
# Fruit Circumference Weight
#1 Blueberry 2 5
#2 Cherry 3 10
#3 Orange 13 30
Данные
df1 <- read.table(text = "
Fruit Circumference Weight
Apple 10 20
Orange 13 30
Pear 10 21
Kiwi 7 15
Cherry 3 10
Strawberry 4 13
Blueberry 2 5
", header = TRUE)
df2 <- read.table(text = "
'Fruit Name'
Orange
Cherry
Blueberry
", header = TRUE, check.names = FALSE)
new <- read.table(text = "
Fruit Circumference Weight
Orange 13 30
Cherry 3 10
Blueberry 2 5
", header = TRUE)
это, кажется, создает таблицу NA
@Sabrina Можете ли вы опубликовать образцы данных? Пожалуйста, отредактируйте вопрос с выводом dput(df1)
. Или, если он слишком велик с выводом dput(head(df1, 20))
. И то же самое для df2
.
@Sabrina Возможный дубликат.
Спасибо, что упомянули аналогичный вопрос, однако ни одно из решений этого вопроса не сработало.
@Sabrina Исправлено, смотрите сейчас.
это работает, если имена столбцов разные?