Хобрук: Ваш путь к мастерству в программировании

как добавить фреймы данных, где имена столбцов совпадают

У меня есть два фрейма данных df1 и df2. Я хочу создать новый фрейм данных df3, который представляет собой просто сумму df1 и df2, где имена столбцов совпадают.

df1 <- data.frame(x1=c(1,4,5),x2=c(5,6,7),x3=c(9,9,10))
df2 <- data.frame(x1=c(1,6,3),x2=c(4,3,1),x3=c(5,4,6),x4=c(7,6,7))

 df1
    x1  x2  x3
 1  1   5   9
 2  4   6   9
 3  5   7   10

df2
    x1  x2  x3  x4
 1  1   4   5   7
 2  6   3   4   6
 3  3   1   6   7

df3
    x1  x2  x3  x4
 1  2   9   14  7
 2  10  9   13  6
 3  8   8   16  7
27.03.2016

Ответы:


1

Мы находим имена столбцов, которые являются общими как для 'df1', так и для 'df2' ('nm1'). Создайте копию 'df2' ('df3'). Добавьте подмножество наборов данных (df1[nm1], df2[nm1]) и назначьте его соответствующему подмножеству «df3».

nm1 <- intersect(names(df1), names(df2))
df3 <- df2
df3[nm1] <- df1[nm1]+df2[nm1]
df3
#  x1 x2 x3 x4
#1  2  9 14  7
#2 10  9 13  6
#3  8  8 16  7

В случае, если в «df1» есть другие уникальные столбцы, которых нет в «df2», и наоборот, один из вариантов — поместить наборы данных в list, затем rbind их с rbindlist (из data.table), создать столбец последовательности («N ') и используйте lapply, чтобы получить sum каждого из столбцов.

library(data.table)
rbindlist(list(df1, df2), fill=TRUE, idcol=TRUE)[,
       N:= 1:.N, .id][,lapply(.SD, sum, na.rm=TRUE) , 
           by = N , .SDcols=x1:x4][, N:= NULL][]
#   x1 x2 x3 x4
#1:  2  9 14  7
#2: 10  9 13  6
#3:  8  8 16  7
27.03.2016
  • Это не сохранит столбцы в df1, которых нет в df2, если таковые существуют. 27.03.2016
  • @RHertel Здесь я предположил, что df3 имеет тот же размер, что и df2. Я не уверен, хочет ли ОП иметь новый набор данных со всеми столбцами, уникальными для df1, df2 и общих. 27.03.2016
  • @акрун. будет ли смысл, если я свяжу df1 и df2, а затем агрегирую идентичные столбцы? 27.03.2016
  • @HaagenDaz Я использовал другой подход, который был бы немного более общим, если бы в любом случае у вас были уникальные столбцы в обоих наборах данных. 27.03.2016
  • @akrun спасибо, второй подход работает лучше, так как его можно применить ко всем сценариям. 27.03.2016
  • @akrun можно ли это применить, если у вас более двух фреймов данных? 27.03.2016
  • @HaagenDaz Да, вы помещаете их в список и делаете, как указано выше. 27.03.2016
  • Давайте продолжим обсуждение в чате. 27.03.2016

  • 2

    Вот одна идея:

    cbind(
        df1[intersect(names(df1),names(df2))]+df2[intersect(names(df1),names(df2))],
        df1[setdiff(names(df1),names(df2))],
        df2[setdiff(names(df2),names(df1))]
    );
    ##   x1 x2 x3 x4
    ## 1  2  9 14  7
    ## 2 10  9 13  6
    ## 3  8  8 16  7
    
    27.03.2016

    3

    Пытаться

    i <- which((!names(df2) %in% names(df1)))
    a <- df2[-i]+df1
    df3 <- cbind(a, df2[i])
    
    27.03.2016

    4

    Вот еще один подход.

    df1 <- data.frame(x1=c(1,4,5),x2=c(5,6,7),x3=c(9,9,10))
    df2 <- data.frame(x1=c(1,6,3),x2=c(4,3,1),x3=c(5,4,6),x4=c(7,6,7))
    
    df3 <- merge(df1, df2, all=T, sort=F)
    df3[is.na(df3)] <- 0
    df4 <- df3[1:(nrow(df3)/2), ] + df3[(nrow(df3)/2+1):nrow(df3), ]
    df4
    #   x1 x2 x3 x4
    # 1  2  9 14  7
    # 2 10  9 13  6
    # 3  8  8 16  7
    
    27.03.2016
    Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.