Я относительно новичок в R и не смог найти нигде, который отвечает на этот запрос.
У меня есть 2 кадра данных с одинаковым количеством строк, но с разным количеством столбцов.Я хочу вычесть значения в соответствующих столбцах, чтобы определить разницу между двумя кадрами данных.
Например, эти 2 кадра данных напоминают те, с которыми я работаю:
df1<-data.frame(Measure=rep("test",3),Filename=c("filename1","filename2","filename3"),Op1=c(79,72,95),Op2=c(NA,NA,5),Op3=c(75,64,66),Op4=c(86,71,58))
Filename Op1 Op2 Op3 Op4
1 filename1 79 NA 75 86
2 filename2 72 NA 64 71
3 filename3 95 5 66 58
df2<-data.frame(Measure=rep("test",3),Filename=c("filename1","filename2","filename3"),Op1=c(9,NA,5),Op4=c(80,70,50))
Filename Op1 Op4
1 filename1 9 80
2 filename2 NA 70
3 filename3 5 50
В настоящее время у меня есть функция, которая объединяет 2 кадра данных и суммирует данные, которые выглядят следующим образом:
CalcFunSum<-function(MeasureName,BoxNumbers){
temp<-data.frame()
for (i in BoxNumbers){
data<-melt(BoxNumbers[i])
temp<-temp %>% bind_rows(data)
}
temp<-cbind(Measure = MeasureName,dcast(temp,Filename~variable,sum,fill = 0))
temp
}
Итак, CalcFunSum(test,c(df1,df2))
сложит вместе 2 фрейма данных и выдаст
Measure Filename Op1 Op2 Op3 Op4
1 test filename1 88 NA 75 166
2 test filename2 72 NA 64 141
3 test filename3 100 5 66 108
Что-то похожее на выполнение вычисления df1-df2 для получения:
Measure Filename Op1 Op2 Op3 Op4
1 test filename1 70 NA 75 6
2 test filename2 72 NA 64 1
3 test filename3 90 5 66 8
Я пытался заменить sum
в функции на diff
, но это не сработало
Есть идеи, как это сделать?
edit - Iпонял, что функция включала ссылку на список, в котором я держу эти фреймы данных, и изменил его.
Продолжение: работа со значениями NA
Итак, ответы до сих пор работают,но при тестировании с моими фактическими данными я заметил, что в случаях, когда df2 имеет NA, но df1 имеет значение, результирующий вывод содержит NA, а не значение в df1.Я собираюсь изменить одно из значений в df2 на NA, чтобы отразить это.
В текущих ответах @akrun и @IceCreamToucan результат будет
Measure Filename Op1 Op2 Op3 Op4
1 test filename1 70 NA 75 6
2 test filename2 NA NA 64 1
3 test filename3 90 5 66 8
Я предполагаю этогде-то в коде есть NA.rm = T, или мне нужно иметь дело со значениями NA на более ранних этапах процесса, но было бы полезно узнать, есть ли в ответах твики, которые могли бы с этим разобраться.