Карта на карте? Работа со столбцами в двух списках фреймов данных - PullRequest
1 голос
/ 29 мая 2020

Я работаю в R и имею два списка фреймов данных. Мне нужно добавить столбец к фреймам данных в списке 1, заполненный значениями, взятыми из соответствующих фреймов данных в списке 2. Я думаю, что мне нужна карта внутри карты или lapply внутри карты, но я когда-либо использовал только Map и lapply самостоятельно или lapply внутри lapply, поэтому у меня возникают проблемы с сортировкой правильного кода. Приведенные ниже списки похожи на те, с которыми я работаю.

dfa<-data.frame(tom=sample(seq(as.Date("2020-01-01"),as.Date("2020-03-01"), 1), 20), id=seq(1:20))
dfb<-data.frame(tom=sample(seq(as.Date("2020-01-01"),as.Date("2020-02-01"), 1), 32), id=seq(1:32))
list1<-list(dfa, dfb)

df1<-data.frame(date=seq(as.Date("2020-01-01"), as.Date("2020-03-01"), 1),num=sample(1:200, 61))
df2<-data.frame(date=seq(as.Date("2020-01-01"), as.Date("2020-03-01"), 1),num=sample(4:200, 61))
list2<-list(df1, df2)

Код, который я пробовал, может быть близок или полностью не соответствует действительности. Я пытаюсь добавить новый столбец «d1» во все фреймы данных в list1. Значения в d1 должны быть извлечены из переменной «num» в фреймах данных list2, где даты совпадают с датами из фреймов данных в list1.

list3<-Map(function(x, y){
           Map(function(v, w){
               v<-cbind(v, d1=w[w$date==v, w$num])}, x$tom, y)},list1, list2)

Это просто возвращает ошибку, касающуюся использования векторов atomi c: «Ошибка в w $ date: оператор $ недопустим для atomi c векторов»

Но если я измените его на индексацию ...

list3<-Map(function(x, y){
       Map(function(v, w){
           v<-cbind(v, d1=w[w[,1]==v, w[,2]])}, x$tom, y)}, list1, list2)

Это тоже не радует: «Ошибка в [.default (w,, 1): неправильное количество измерений»

К этому моменту я Я как бы потерял представление о том, на что я пытаюсь сослаться в самой внутренней функции и как правильно к ней обращаться. Это даже близко к тому, что я хочу?

1 Ответ

1 голос
/ 29 мая 2020

Мы могли бы использовать merge

Map(function(dat1,  dat2)  merge(dat1, dat2, by.x = 'tom',
        by.y = 'date', all.x = TRUE), list1, list2)

Если нам нужно переименовать столбец

Map(function(dat1,  dat2)  {
    out <- merge(dat1, dat2, by.x = 'tom', by.y = 'date', all.x = TRUE)
    names(out)[3] <- 'd1'
    out}, 
       list1, list2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...