填写缺失数据的简便方法

时间:2014-02-20 15:51:03

标签: java r excel pivot-table data-mining

我有一张包含优化算法结果的表格。我有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中读取它? (我将用R的ggplot绘制年龄)。

所以预期的输出看起来像这样:

x1; y1  ; x2 ; y2
1 ; 100 ; 1  ; 150
2 ; 100 ; 2  ; 85
4 ; 90  ; 4  ; 85
7 ; 85  ; 7  ; 85
10; 80  ;10 ; 60

- UPDATE

我已经在下面应用了agstudy的答案。这是我的剧本:

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 个答案:

答案 0 :(得分:2)

例如,在R中,您可以分两步完成。首先合并你的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

答案 1 :(得分:1)

使用Excel,您可以使用VLOOKUP,如果您首先列出所有唯一排序x值的列(一列似乎足够?)和y类似的列:

=VLOOKUP($F2,A:B,2)  

=VLOOKUP($F2,C:D,2) y2)每个都被复制以适应。

SO21912834 first example

或者,如果您准备沿着*显示的行更改源数据布局,那么您可以使用数据透视表,使用选择性粘贴...,值复制,将某些内容放在单元格的右侧Values,选择y1y2列,转到特殊,空白,=,向上,Ctrl + Enter

*或删除x标签中的数字,并使用多个合并范围。

SO21912834 second example