Arhn - архитектура программирования

R: замена NA в data.frame значениями в той же позиции в другом dataframe

У меня есть фрейм данных с некоторыми значениями NA:

dfa <- data.frame(a=c(1,NA,3,4,5,NA),b=c(1,5,NA,NA,8,9),c=c(7,NA,NA,NA,2,NA))
dfa

Я хотел бы заменить NA значениями в той же позиции в другом фрейме данных:

dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3))
dfrepair

Я пытался:

dfa1 <- dfa

dfa1 <- ifelse(dfa == NA, dfrepair, dfa)
dfa1

но это не сработало.

15.12.2016

Ответы:


1

Ты можешь сделать:

dfa <- data.frame(a=c(1,NA,3,4,5,NA),b=c(1,5,NA,NA,8,9),c=c(7,NA,NA,NA,2,NA))
dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3))
dfa[is.na(dfa)] <- dfrepair[is.na(dfa)]
dfa

  a b c
1 1 1 7
2 3 5 7
3 3 4 6
4 4 3 5
5 5 8 2
6 7 9 3
15.12.2016
  • При создании новой таблицы вместо изменения dfa: replace(dfa, is.na(dfa), dfrepair[is.na(dfa)]) 16.12.2016

  • 2

    В tidyverse вы можете использовать purrr::map2_df, который является строго двумерной версией mapply, который упрощается до data.frame, и dplyr::coalesce, который заменяет значения NA в первом аргументе на соответствующие значения во втором.

    library(tidyverse)
    
    dfrepair %>% 
        mutate_all(as.numeric) %>%    # coalesce is strict about types
        map2_df(dfa, ., coalesce)
    
    ## # A tibble: 6 × 3
    ##       a     b     c
    ##   <dbl> <dbl> <dbl>
    ## 1     1     1     7
    ## 2     3     5     7
    ## 3     3     4     6
    ## 4     4     3     5
    ## 5     5     8     2
    ## 6     7     9     3
    
    15.12.2016

    3

    Мы можем использовать Map из base R для сравнения двух наборов данных по столбцам.

    dfa[] <- Map(function(x,y) {x[is.na(x)] <- y[is.na(x)]; x}, dfa, dfrepair)
    dfa
    #  a b c
    #1 1 1 7
    #2 3 5 7
    #3 3 4 6
    #4 4 3 5
    #5 5 8 2
    #6 7 9 3
    
    16.12.2016

    4
    dfa <- data.frame(a=c(1,NA,3,4,5,NA),b=c(1,5,NA,NA,8,9),c=c(7,NA,NA,NA,2,NA))
    dfa
    dfrepair <- data.frame(a=c(2:7),b=c(6:1),c=c(8:3))
    dfrepair 
    library(dplyr)
    coalesce(as.numeric(dfa), as.numeric(dfrepair))
    
      a b c
    1 1 1 7
    2 3 5 7
    3 3 4 6
    4 4 3 5
    5 5 8 2
    6 7 9 3
    

    Поскольку код в dplyr написан на C ++, в большинстве случаев он работает быстрее. Другое важное преимущество состоит в том, что coalesce, как и многие другие dplyr функции, одинаковы в SQL. Используя dplyr, вы изучаете SQL, кодируя R. ;-)

    16.12.2016
  • Ошибка as.numerics для меня, хотя coalesce(dfa, dfrepair) на удивление действительно работает (документы говорят только о векторах, а не целых data.frames) и не жалуются на разные типы. 19.12.2016
  • Спасибо за as.numeric. ;-) Data.frame - это список списков и векторов. В приведенном выше случае, а также во многих других случаях это просто список векторов, содержащих числа. Поэтому в нашем случае это очень похоже на матрицу. Если data.frame содержит рекурсивные списки, мой код не будет работать. 20.12.2016
  • Data.frame может выглядеть как матрица, но основная структура сильно отличается. Data.frame - это список одномерных векторов, тогда как матрица - это единственный вектор с двумя измерениями. Большинство функций, разработанных для векторов, не работают с data.frames; подмножество в coalesce должно быть случайным. 20.12.2016
  • A <- matrix(1:9, nrow = 3) is.vector(A) отображает FALSE. Согласно этому тесту матрица не является одним вектором в R. 21.12.2016
  • Из определения языка: Матрицы а массивы - это просто векторы с атрибутом dim и, возможно, dimnames, прикрепленными к вектору. Например. x <- diag(3); attributes(x) <- NULL; x Списки также являются векторами (общими, а не атомарными), например is.vector(list(1)), запутывая слово. is.vector просто проверяет атрибуты, отличные от имен, поэтому is.vector(iris) возвращает FALSE, хотя typeof(iris) возвращает "list". Лучшая проверка: purrr::is_vector(diag(3)); purrr::is_atomic(diag(3)): TRUE; TRUE. 21.12.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..