【问题标题】:Group instances based on NA values in r根据 r 中的 NA 值对实例进行分组
【发布时间】:2015-06-15 14:04:58
【问题描述】:

我正在阅读一个csv 文件,不幸的是我的数据框有很多缺失值。一个小片段如下:

df <- data.frame(Size= c(800, 850, 1100, 1200, 1000), 
                 Value= c(900, NA, 1300, 1100, NA),
                 Location= c(NA, 'midcity', 'uptown', NA, 'Lakeview'),
                 Num1 = c(2, NA, 3, 2, NA),
                 Num2 = c(2,3,3,1,2),
                 Rent= c('y', 'y', 'n', 'y', 'n'))

我想使用weka 预测一些结果,但如果我缺少多个属性,我就无法做到。我知道我应该使用函数is.na,但我不确定它可以通过什么方式完成,因为到目前为止我只将它用于求和和计数。

编辑: 例如,在此文件中,5 个实例中有 4 个缺失值。实例 2 和 5 共享相同的缺失属性(B 和 D),而实例 1 和 4 也共享相同的缺失值(C)。我想要得到的是一个由这些实例组成的数据框,因此我可以将它们导出到文件中并单独对这些文件运行分析。一个输出的例子可以是

&gt; A

&gt; B

编辑 2:

我想保存拆分,到目前为止我试过这个:

write.csv(split(temp, index), file = "C:/Users/Nikita/Desktop/splits.csv", row.names=FALSE)

但是它将所有的拆分写在一行中。有没有办法用一条线分隔它们?

编辑 3:

我的步骤是:

data <- read.csv("location")
index <- apply(is.na(data)*1, 1,paste, collapse = "")
s <- split(data, index)
lapply(s, function(x) {names(x) <- names(data);x})
big.data <- do.call(rbind, s)
write.csv(big.data, file = "location", row.names=FALSE)

我错过了什么吗?

【问题讨论】:

标签: r file csv instance na


【解决方案1】:
df[!is.na(df$Value), ]
  Size Value Location Num1 Num2 Rent
1  800   900     <NA>    2    2    y
3 1100  1300   uptown    3    3    n
4 1200  1100     <NA>    2    1    y

df[is.na(df$Value), ]
  Size Value Location Num1 Num2 Rent
2  850    NA  midcity   NA    3    y
5 1000    NA Lakeview   NA    2    n

以后,请创建一个可重现的示例,以便用户不必根据您的问题手动创建数据框。图片没那么有用。

数据

df <- data.frame(Size= c(800, 850, 1100, 1200, 1000), 
                 Value= c(900, NA, 1300, 1100, NA),
                 Location= c(NA, 'midcity', 'uptown', NA, 'Lakeview'),
                 Num1 = c(2, NA, 3, 2, NA),
                 Num2 = c(2,3,3,1,2),
                 Rent= c('y', 'y', 'n', 'y', 'n'))

要结合所有这些,请使用 lapply,因为 split 创建了一个列表:

lapply(split(temp, index), write.csv, file = "C:/Users/Nikita/Desktop/splits.csv", row.names=FALSE)

使用 for 循环:

s <- split(temp, index)
for (i in 1:length(s)) {
  write.csv(s[i], file = paste0("C:/Users/Nikita/Desktop/", i, "splits.csv"), row.names=FALSE)
}

【讨论】:

  • 感谢您的回答和提供的代码!
  • 它只保存第一个拆分。我需要使用循环还是我做错了什么?
  • 我忘记了有一个文件被输入到函数中。因此,它将尝试将所有拆分写入该文件。尝试一个 for 循环。我再次编辑了我的答案。
  • 完美运行!谢谢。
  • 大声笑用户。我把那些大于和小于符号告诉你输入数据框的名称。实际上不要把它放进去。例如,如果您的原始数据框包含您想要的所有列名,则称为“mydf”。你会输入lapply(s, function(x) {names(x) &lt;- names(mydf);x}
【解决方案2】:

重新创建示例数据:

df <- data.frame(Size= c(800, 850, 1100, 1200, 1000), 
                 Value= c(900, NA, 1300, 1100, NA),
                 Location= c(NA, 'midcity', 'uptown', NA, 'Lakeview'),
                 Num1 = c(2, NA, 3, 2, NA),
                 Num2 = c(2,3,3,1,2),
                 Rent= c('y', 'y', 'n', 'y', 'n'))

现在,根据需要根据 NA 的模式拆分数据:

# This generates an index with 1 for a column with NA and 0 otherwise
index <- apply(is.na(df)*1, 1,paste, collapse = "")

# This splits the data.frame according to the index
split(df, index)
$`000000`
  Size Value Location Num1 Num2 Rent
3 1100  1300   uptown    3    3    n

$`001000`
  Size Value Location Num1 Num2 Rent
1  800   900     <NA>    2    2    y
4 1200  1100     <NA>    2    1    y

$`010100`
  Size Value Location Num1 Num2 Rent
2  850    NA  midcity   NA    3    y
5 1000    NA Lakeview   NA    2    n

请注意,第一个元素“000000”包含所有具有完整案例的观察结果。然后“001000”包含缺少第 3 列(位置)的所有观察值。以此类推。

【讨论】:

  • 完美运行。谢谢!不过,另一个快速的问题。这只是我数据的一小部分。我的整个数据框由 244 个属性组成。有没有办法可以自动将结果输出到文件中?
  • @User 您可以将所有结果保存在对象results &lt;- split(df, index) 中,然后将结果保存在csv 文件中for(i in 1:length(results)) write.csv(results[[i]], file = paste0("C:/Users/Nikita/Desktop/", "splits", i, ".csv"), row.names=FALSE)
  • 谢谢!我使用了plafort的方法,因为他回答得较早,但无论如何还是谢谢。一个快速的问题:有没有办法用原始列名保存文件,或者它必须包含每一列的组合号?
猜你喜欢
  • 2023-02-03
  • 1970-01-01
  • 2016-02-15
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多