Добавление вектора с векторной индексацией - PullRequest
0 голосов
/ 14 декабря 2018

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

У меня есть два кадра данных, A и B, где A имеет намного больше строк, чемB. Я хочу найти значение из B на основе столбца A и добавить его в другой столбец A. Что-то вроде:

A$ColumnToAdd + B[ColumnToMatch == A$ColumnToMatch,]$ColumnToAdd

Но я получаю, с загрузкой NA:

Warning in `==.default`: longer object length is not a multiple of shorter object length

Я мог бы сделать это с помощью грязного цикла for, но я ищу что-то более быстрое и элегантное.

Спасибо

1 Ответ

0 голосов
/ 14 декабря 2018

Если я правильно понял ваш вопрос, вы ищете слияние или объединение , как предлагается в комментариях.

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

library(tidyverse)

# Some dummy data
ColumnToAdd <- c(1,1,1,1,1,1,1,1)
ColumnToMatch  <- c('a','b','b','b','c','a','c','d')
A <- data.frame(ColumnToAdd, ColumnToMatch)
ColumnToAdd <- c(1,2,3,4)
ColumnToMatch <- c('a','b','c','d')
B <- data.frame(ColumnToAdd, ColumnToMatch)

# Example using merge
A %>% 
  merge(B, by = c("ColumnToMatch")) %>%  
  mutate(sum = ColumnToAdd.x + ColumnToAdd.y)                    

# Example using join
A %>% 
  inner_join(B, by = c("ColumnToMatch")) %>% 
  mutate(sum = ColumnToAdd.x + ColumnToAdd.y)    

Преимущества версий dplyr перед слиянием - :

  • строки сохраняются в существующем порядке
  • намного быстрее
  • сообщает вам, какие ключи вы объединяете (если вы не предоставляете)
  • такжеработа с таблицами базы данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...