Добавление нескольких фреймов данных с одинаковыми именами столбцов на основе определенных значений столбцов в R

r dataframe merge

389 просмотра

2 ответа

У меня есть несколько фреймов данных с одинаковыми именами столбцов и измерения. :

 df1
    device_id    price     tax
1       a         200       5
2       b         100       2
3       c         50        1 

 df2
    device_id    price     tax
1       b         200       7
2       a         100       3
3       c         50        1


 df3
    device_id    price     tax
1       c         50       5
2       b         300      1
3       a         50       2  

То, что я хочу сделать, - это создать еще один фрейм данных, в dfкоторый я добавлю цену и налоги из трех вышеупомянутых фреймов с соответствующими значениями device_ids.

Итак, dfбыло бы как

df
    device_id    price     tax
1       a         350       10
2       b         600       10
3       c         150        7 

Как я могу это сделать? Кроме того, было бы здорово, если бы решение можно было обобщить на большее количество фреймов данных вместо всего лишь 3.

Автор: hmi2015 Источник Размещён: 08.11.2019 10:56

Ответы (2)


1 плюс

Во-первых, поместите все ваши фреймы данных в список (называемый dflistздесь, определенный ниже). Тогда это легко сделать aggregate()после связывания строк с элементами списка.

aggregate(. ~ device_id, do.call(rbind, dflist), sum)
#   device_id price tax
# 1         a   350  10
# 2         b   600  10
# 3         c   150   7

Или вы можете использовать пакет data.table .

library(data.table)
rbindlist(dflist)[, lapply(.SD, sum), by = device_id]
#    device_id price tax
# 1:         a   350  10
# 2:         b   600  10
# 3:         c   150   7

Или dplyr .

library(dplyr)
bind_rows(dflist) %>% 
    group_by(device_id) %>%
    summarize_each(funs(sum))
# Source: local data frame [3 x 3]
#
#   device_id price   tax
#      <fctr> <int> <int>
# 1         a   350    10
# 2         b   600    10
# 3         c   150     7

Данные:

dflist <- structure(list(df1 = structure(list(device_id = structure(1:3, .Label = c("a", 
"b", "c"), class = "factor"), price = c(200L, 100L, 50L), tax = c(5L, 
2L, 1L)), .Names = c("device_id", "price", "tax"), class = "data.frame", row.names = c("1", 
"2", "3")), df2 = structure(list(device_id = structure(c(2L, 
1L, 3L), .Label = c("a", "b", "c"), class = "factor"), price = c(200L, 
100L, 50L), tax = c(7L, 3L, 1L)), .Names = c("device_id", "price", 
"tax"), class = "data.frame", row.names = c("1", "2", "3")), 
    df3 = structure(list(device_id = structure(c(3L, 2L, 1L), .Label = c("a", 
    "b", "c"), class = "factor"), price = c(50L, 300L, 50L), 
        tax = c(5L, 1L, 2L)), .Names = c("device_id", "price", 
    "tax"), class = "data.frame", row.names = c("1", "2", "3"
    ))), .Names = c("df1", "df2", "df3"))
Автор: Rich Scriven Размещён: 20.08.2016 06:00

1 плюс

Мы можем использовать byс base Rпосле того, как rbindING после мы размещаем все объекты data.frame в list( mget(paste0("df", 1:3)))

 dfN <- do.call(rbind, mget(paste0("df", 1:3)))
 do.call(rbind, by(dfN[-1], dfN[1], FUN = colSums))
Автор: akrun Размещён: 20.08.2016 06:34
Вопросы из категории :
32x32