【问题标题】:Easy way to fill in missing data填写缺失数据的简单方法
【发布时间】:2014-03-21 16:37:41
【问题描述】:

我有一个表格,其中包含优化算法的结果。我有 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,4 处的 y 为 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

--更新

我在下面应用了 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

【问题讨论】:

  • 你能澄清一下预期的输出吗?
  • 对不起,你是对的。我在问题中添加了一个示例输出。

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


【解决方案1】:

例如,在 R 中,您可以分两步完成此操作。首先你合并你的 2 个运行,然后你用最后一个没有缺失的值填充缺失的值。为此,我正在使用 zoo 包中的 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

【讨论】:

  • 我真的很喜欢你的方法,但是,一些 x2 数据点似乎丢失了。可以吗?我将把我的代码放在问题中。
  • @dorien 我认为这不会发生,因为我使用 mergeall=TRUE 选项。
  • 很好奇,我想我在上面的脚本中遗漏了一些简单的东西。相比之下,您的示例效果很好。
  • 好的,我有一个非常愚蠢的输入错误,读取同一个文件两次!现在我只有这个错误: newdata$score2 $<-.data.frame(*tmp*, "score2", value = c(40152.6, 40152.6, : 替换有 11767 行) 中的错误, 数据有 11768
  • 可能是因为后面有空行?
【解决方案2】:

使用 Excel,如果首先有一列所有唯一排序的 x 值升序(一列似乎就足够了?)并且对于 y,则可以使用 VLOOKUP:

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

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

或者,如果您准备按照* 所示的行更改源数据布局,那么您可以使用数据透视表,使用选择性粘贴...复制它,值,在紧靠@987654329 右侧的单元格中放置一些内容@,选择 y1y2 列,然后转到特殊、空白、=、向上、Ctrl+Enter

* 或从x 标签中删除数字并改用多个合并范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多