Извлечение значений из одной таблицы на основе столбцов в другой таблице - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть два кадра данных. Первый (df1) выглядит так:

Item       Col1        Col2        Col3         
 A         Food        Fruit       Apple        
 B         Food        Veggie      NA
 C         xxx          yyy        zzz   

Вторая таблица (df2) выглядит так:

 Name        Number
Apple         Col3
Veggie        Col2

Я хочу получить финальный стол, как показано ниже:

Item        Name        Number
 A          Apple        Col3
 B          Veggie       Col2

Я пытался использовать цикл for:

    for (i in 1:nrow(df2)){ 
        new_df <- subset(df1, df2[i,1] %in% df1$df2[,2])
        print(new_df)
}

Я знаю, что синтаксис неверен для моего кода. Если у кого-то есть идеи, что мне делать, пожалуйста, дайте мне знать. Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Если вы хотите сделать это с помощью цикла, вы можете сделать это так:

ДАННЫЕ

df1 = data.frame(Item=c("A","B"), Col1 = "Food", Col2 = c("Fruit", "Veggie"), 
  Col3 = c("Apple",NA), stringsAsFactors = F)
df2 = data.frame(Name  = c("Apple", "Veggie"), Number = c("Col3", "Col2"),
  stringsAsFactors = F)

РЕШЕНИЕ С ПЕТЛЕЙ

new_df = df2
for(i in 1:nrow(new_df)){
  new_df$Item[i] = df1[which(df1[[df2$Number[i]]] == df2$Name[i]),"Item"]
}
new_df
0 голосов
/ 24 апреля 2018

с использованием извлечения базы R вместо слияния:

cbind(df1[1],Name=df1[cbind(1:nrow(df1),match(df2$Number,names(df1)))],df2[2])
  Item   Name Number
1    A  Apple   Col3
2    B Veggie   Col2
0 голосов
/ 24 апреля 2018

Мы можем изменить первый кадр данных, а затем отфильтровать его по второму кадру данных.df3 - конечный результат.

library(tidyverse)

df3 <- df1 %>%
  gather(Number, Name, -Item) %>%
  semi_join(df2, by = c("Name", "Number")) %>%
  select(Item, Name, Number) %>%
  arrange(Item)
df3
#   Item   Name Number
# 1    A  Apple   Col3
# 2    B Veggie   Col2

ДАННЫЕ

df1 <- read.table(text = "Item       Col1        Col2        Col3         
 A         Food        Fruit       Apple        
 B         Food        Veggie      NA
 C         xxx          yyy        zzz ",
                  header = TRUE, stringsAsFactors = FALSE)


df2 <- read.table(text = " Name        Number
Apple         Col3
Veggie        Col2",
                  header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...