【问题标题】:How to Preprocess data to handle missing values in R如何预处理数据以处理 R 中的缺失值
【发布时间】:2014-04-27 02:13:01
【问题描述】:

我正在尝试在 R 中预处理我的数据,以便我可以使用 “与给定元组属于同一类的所有样本的属性均值”

数据源提供者已为缺失值或超出范围的值赋予了值 -1。但是我想根据上面粗体说明的数据挖掘原则替换那些缺失值。作为我的类决定器的列是“事故严重性”,我想为属于与具有缺失属性值的元组的严重性级别相同的事故严重性级别的所有样本提供属性平均值。

由于有多列缺少值,我想我将不得不一次对所有列重复执行任务。我应该使用什么 r 命令。

我的数据框中主要有两种类型的数据类型(向量)。因子适用于日期和时间列,而整数适用于大多数其他列。

有没有办法可以在堆栈溢出时上传数据集的子集?

这里是可重现数据集https://drive.google.com/file/d/0B3cafW7J7xSfSkRTYWRWMHhaU2c/edit?usp=sharing的链接

更新 2:现在数据集已经存在,请帮助我将任何列中存在“-1”的值更改为具有相同值的所有元组的平均值将“Accident_severity”属性作为具有缺失值的元组..

更新 3:请忽略“X2_roadclass”和“X2_Road_type”列,因为它们大部分是空白的,我将删除它们。谢谢

【问题讨论】:

  • 您应该查看this,了解您应该如何发布数据并正确提问,以最大限度地提高在这里获得帮助的机会。
  • 如果您提供一个最小的、独立的示例,帮助会容易得多。请查看这些链接以获得一般想法,以及如何在 R 中进行操作:here、here 和 here。也看看一个不错的checklist for questions on SO。您还应该向我们展示您尝​​试过的代码。
  • 我正在尝试使用 Dput 命令,即使在我只选择了 10% 的记录之后,它也创建了一个 100 MB 的文件。当我尝试使用 dget 读取相同的文件时,Rstudio 控制台卡在阅读它超过 20 分钟没有任何结果。我应该只取 100 条记录并使用 Dput 制作文件吗?
  • @apps92 :创建较小的数据子集,可以粘贴到这里,但仍然代表问题。
  • @apps92 这个想法是总结所有 [Accident_Severity] 级别的所有 20 个变量?

标签: r dataframe statistics dataset data-mining


【解决方案1】:

请看看这是否符合您的需要

library(ggplot2)
library(reshape)
library(plyr)

创建一些数据

   set.seed(1)
    df <- data.frame(severity=rep(c('high', 'moderate', 'low'), each = 3),
                     factor1 = rep(c(1,2,3), each = 6),
                     factor2 = rep(c(4,5,6), times = 3),
                     date=rep(c('2011-01-01','2011-01-03','2011-01-10'),
                           times = 3), stringsAsFactors = F)

有些-1

df$factor2[3] <- -1
df$factor1[1] <- -1

用 NA 替换它们

df[df == -1] <- NA

重塑它

mdf <- melt(df, id.vars= c("severity", 'date'))

总结

ddply(mdf, .(severity, variable), summarise, mean=mean(value, na.rm = T))

  severity variable mean
1     high  factor1  1.6
2     high  factor2  4.8
3      low  factor1  2.5
4      low  factor2  5.0
5 moderate  factor1  2.0
6 moderate  factor2  5.0

有了提供的数据,我会做这样的事情

dt <- read.csv('./Stackoverflow/datatry1.csv')

#head(dt[ , -c(1:3) ]) # Exclude some unwanted colums
mdt <- melt(dt[ , -c(1:3) ], id.vars= c("Accident_Severity", 'Date',
                                        'Day_of_Week', 'Time'))
dts <- ddply(mdt, .(Accident_Severity, variable), summarise,
             mean=mean(value, na.rm = T))
dts

   Accident_Severity                   variable         mean
1                  1         Number_of_Vehicles   1.00000000
2                  1            X1st_Road_Class   3.00000000
3                  1           X1st_Road_Number 503.00000000
4                  1                  Road_Type   6.00000000
5                  1                Speed_limit  30.00000000
6                  1            Junction_Detail   3.00000000
7                  1            X2nd_Road_Class  -1.00000000
...

【讨论】:

  • 我在 CRAN 文档中浏览了 Reshape 包的文档,但仍然不明白 melt 命令的工作原理以及 id.vars 的确切作用。
  • @apps92 简而言之,id.vars 可以被视为您的参考变量。所有其他都是测量变量,总是关于你的 id.vars
  • 是否需要在id.vars中添加其他列..我只是想根据Accident_severity来判断
  • @apps92 我想是的。我们的想法是获取每个 Accident_Severity 的平均摘要。您是否使用您的数据检查了上面的代码?是否给出了预期的结果?
  • 是的.. 我用我的数据尝试了上面的代码.. 我没有省略前 3 列,但它们仍然从未出现在输出中.. 我想知道为什么。除此之外,输出看起来非常棒......但这只是我猜的一半......现在我是否为所有这些 30+ 输出结果分配平均值而不是“-1”,还是有可编程的方式?跨度>
猜你喜欢
  • 2020-01-06
  • 1970-01-01
  • 2019-05-25
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
相关资源
最近更新 更多