Простой способ заполнить недостающие данные
У меня есть таблица с результатами алгоритма оптимизации. У меня 100 пробежек. X представляет время и сохраняется только при сохранении улучшения. Так что мне не хватает x-es.
x1; y1 ; x2 ; y2
1 ; 100 ; 1 ; 150
4 ; 90 ; 2 ; 85
7 ; 85 ; 10 ; 60
10; 80 ;
Это просто CSV. Я ищу метод, чтобы легко обработать это. Так же хочется рассчитать средние значения по каждому x-значению. Таким образом, среднее значение при x = 4 должно учитывать, что для прогона 2 значение y при 4 равно 85.
Любой простой способ сделать это с помощью Excel. Или читать это в Java или R? (Я буду заговаривать возраст с ggplot R).
Таким образом, ожидаемый результат будет выглядеть так:
x1; y1 ; x2 ; y2
1 ; 100 ; 1 ; 150
2 ; 100 ; 2 ; 85
4 ; 90 ; 4 ; 85
7 ; 85 ; 7 ; 85
10; 80 ;10 ; 60
--ОБНОВИТЬ
Я применил ответ агстуди ниже. Это мой сценарий:
library(ggplot2)
library(zoo)
data1 = read.table("rundata1", sep= " ", col.names=c("tm1","score1","current1"))
data2 = read.table("rundata1", sep= " ", col.names=c("tm2","score2","current2"))
newdata<- merge(data1[,1:2],data2[,1:2],by=1,all=T)
newdata <- newdata[!is.na(newdata$tm1),]
newdata$score1 <- zoo::na.locf(newdata$score1)
newdata$score2 <- zoo::na.locf(newdata$score2)
Почти работает сейчас. Только есть ошибка:
newdata$score2 <- zoo::na.locf(newdata$score2)
Error in `$<-.data.frame`(`*tmp*`, "score2", value = c(40152.6, 40152.6, :
replacement has 11767 rows, data has 11768
2 ответа
Например, в R вы можете сделать это в 2 шага. Сначала вы объединяете свои 2 прогона, затем заполняете пропущенные значения последним, не пропуская. я использую na.locf
из пакета зоопарка для этого.
xx <- read.table(text='x1; y1 ; x2 ; y2
1 ; 100 ; 1 ; 150
4 ; 90 ; 2 ; 85
7 ; 85 ; 10 ; 60
10; 80 ;',sep=';',fill=TRUE,header=TRUE)
dm <- merge(xx[,1:2],xx[,3:4],by=1,all=T)
dm <- dm[!is.na(dm$x1),]
dm$y1 <- zoo::na.locf(dm$y1)
dm$y2 <- zoo::na.locf(dm$y2)
dm
x1 y1 y2
1 1 100 150
2 2 100 85
3 4 90 85
4 7 85 85
5 10 80 60
С Excel вы можете использовать VLOOKUP, если сначала у вас есть столбец всех уникальных отсортированных x
значения по возрастанию (один столбец кажется достаточным?) и для y
что-то вроде:
=VLOOKUP($F2,A:B,2)
(=VLOOKUP($F2,C:D,2)
за y2
) каждый переписал, чтобы удовлетворить.
В качестве альтернативы, если вы готовы изменить макет исходных данных в соответствии с указанными линиями*
затем вы можете использовать сводную таблицу, скопировать ее с помощью специальной вставки..., значения, поместить что-то в ячейку сразу справа от Values
выберите y1
а также y2
колонки и Go To Special, Бланки, =
, Вверх, Ctrl
+Enter
,
*
или удалите номера из x
метки и использовать несколько диапазонов консолидации вместо этого.