Как извлечь значения из столбца в фрейм данных, сопоставив два других столбца в R - PullRequest
1 голос
/ 28 марта 2020

У меня такой вопрос: есть два кадра данных с разными строками. Я хочу извлечь значения из "bb" в dfb в "bb" в dfa путем сопоставления поля "aa" в двух данных.

dfa <- data.frame(cbind(c(1,2,3,4,5), c(0,0,0,0,0)))
colnames(dfa) <- c("aa", "bb")
dfb <- data.frame(cbind(c(3,5,1), c(8,6,10)))
colnames(dfb) <- c("aa", "bb")

Результат dfa должен быть таким:

aa  bb
1   10
2   0
3   8
4   0
5   6

В настоящее время я использую al oop, чтобы решить это следующим образом:

for (i in 1:nrow(dfa)) {
    for (j in 1:nrow(dfb)) {
      if(dfa$aa[i] == dfb$aa[j] ) {
        dfa$bb[i] <- dfb$bb[j] }
    }
  }

Но у меня большие данные, поэтому они довольно медленные. Существуют ли какие-либо функции или прямые способы решения этой проблемы? Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Если вы используете dplyr, это довольно просто (сначала объедините 2 кадра данных, затем выберите правильные значения из столбцов bb.x и bb.y на основе значений NA в bb.x. Наконец, оставьте только необходимые столбцы.

dfa %>% 
  dplyr::left_join(dfb, by = "aa") %>% 
  dplyr::mutate(bb = ifelse(is.na(bb.y), bb.x, bb.y)) %>% 
  dplyr::select(aa, bb)

Результат

  aa bb
1  1 10
2  2  0
3  3  8
4  4  0
5  5  6
0 голосов
/ 28 марта 2020

Мы можем использовать match:

dfa$bb[match(dfb$aa, dfa$aa)] <- dfb$bb
#In this case this will also work
#dfa$bb[dfb$aa] <- dfb$bb

dfa
#  aa bb
#1  1 10
#2  2  0
#3  3  8
#4  4  0
#5  5  6

Если в dfb есть значения, которых нет в dfa, мы можем сделать то же самое в другом направлении

dfa$bb <- dfb$bb[match(dfa$aa, dfb$aa)]

Если нам нужно заменить NA на 0, мы можем сделать:

dfa$bb[is.na(dfa$bb)] <- 0

Это похоже на использование merge

merge(dfa, dfb, all.x = TRUE, by = 'aa')[-2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...