Связать столбцы из списков с другим списком - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть вызов списка Totalsamples, внутри списка у меня есть 9 фреймов данных, которые выглядят так:

year  total
2015   100
2016   115
2017   150
2018   155

У меня есть другой вызов списка counts, внутри списка у меня 9 данныхфреймы, которые выглядят так:

year   A   B   C   Sum    
2015   15  10  5   30          
2016   10  13  12  35                   
2017   5   8   15  28             
2018   9   10  5   24

Я хочу добавить столбец Total из фреймов данных в списке Totalsamples, к фреймам данных в списке counts

Так что я получаю это в каждом фрейме данных из списка counts

year   A   B   C   Sum  Total   
2015   15  10  5   30    100      
2016   10  13  12  35    115                
2017   5   8   15  28    150         
2018   9   10  5   24    155

Я пробовал это

counts<- lapply(counts, function (x) cbind(x, Total = Totalsamples[[x]][total]))   

Но я предполагаю, что я неправильно индексирую список Totalsamples.Подскажите, как правильно это сделать?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы можете использовать mapply().

Сначала приведем несколько примеров данных:

Totalsamples <- list(
    data.frame(year = 1990:2000, total = rpois(11, 100)),
    data.frame(year = 1990:2000, total = rpois(11, 100))
  )
counts <-list(
    data.frame(
      year = 1990:2000,
      a = rpois(11, 10),
      b = rpois(11, 20)),
    data.frame(
      year = 1990:2000,
      a = rpois(11, 10),
      b = rpois(11, 20)
    )
  )

Суммируйте столбцы в counts

counts <- lapply(counts, function(x) {
  x$sum <- rowSums(x[c("a", "b")])
  x
})

Теперь используйте mapply() для привязки. Примечание: для этого требуется, чтобы порядок строк был одинаковым во всех фреймах данных, а порядок фреймов данных был одинаковым.т.е. он будет привязывать первую строку первого data.frame в Totalsamples с первой строкой первого data.frame в счетчиках и так далее ...

mapply(function(x, y) {
  out <- cbind(x, y["total"])
  out
}, counts, Totalsamples, SIMPLIFY = FALSE)
0 голосов
/ 26 февраля 2019

Да, вы правы, вы неправильно индексируете.Вы пытаетесь проиндексировать TotalSamples с помощью data.frame для подсчета.

Вместо этого вы можете использовать один из них.

counts =  lapply(1:length(counts), function (i) cbind(counts[[i]], Total = Totalsamples[[i]][total])) 

Или

for(i in 1:length(counts)){
  counts[[i]]$Total = Totalsamples[[i]]$total
}

Или вы можете:

counts = mapply(function(x, y) cbind(x, y[,-1]), counts, Totalsamples)
...