Как я могу подмножить фрейм данных со вторым фреймом данных

У меня есть два набора данных, которые были импортированы. Второй набор данных имеет только один столбец, который соответствует 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мы можем использовать inner_join. У него также есть возможность проверять только выбранные столбцы с аргументом by.

library(dplyr)
inner_join(df1, df2)

Или еще вариант intersect от dplyr

intersect(df1, df2)

С опубликованными данными это будет

inner_join(df1, df2, by = c("Fruit" = "Fruit Name"))

это работает, если имена столбцов разные?

Sabrina 11.12.2020 19:40

@Sabrina Возможно, вам придется установить имена одного набора данных с именем другого, то есть inner_join(df1, setNames(df2, names(df1))) (при условии, что столбцы находятся в том же порядке)

akrun 11.12.2020 19:41

@Sabrina Или вы можете указать опцию by в inner_join, т.е. inner_join(df1, df2, by = setNames(names(df2), names(df1)))

akrun 11.12.2020 19:43
Ответ принят как подходящий

Вот три базовых способа 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 11.12.2020 19:50

@Sabrina Можете ли вы опубликовать образцы данных? Пожалуйста, отредактируйте вопрос с выводом dput(df1). Или, если он слишком велик с выводом dput(head(df1, 20)). И то же самое для df2.

Rui Barradas 11.12.2020 20:43

@Sabrina Возможный дубликат.

Rui Barradas 11.12.2020 20:45

Спасибо, что упомянули аналогичный вопрос, однако ни одно из решений этого вопроса не сработало.

Sabrina 13.12.2020 11:26

@Sabrina Исправлено, смотрите сейчас.

Rui Barradas 13.12.2020 17:46

Другие вопросы по теме