Простой способ заполнить недостающие данные

У меня есть таблица с результатами алгоритма оптимизации. У меня 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) каждый переписал, чтобы удовлетворить.

SO21912834 первый пример

В качестве альтернативы, если вы готовы изменить макет исходных данных в соответствии с указанными линиями* затем вы можете использовать сводную таблицу, скопировать ее с помощью специальной вставки..., значения, поместить что-то в ячейку сразу справа от Valuesвыберите y1 а также y2 колонки и Go To Special, Бланки, =, Вверх, Ctrl+Enter,

* или удалите номера из x метки и использовать несколько диапазонов консолидации вместо этого.

SO21912834 второй пример

Другие вопросы по тегам