根据 r 中的 NA 值对实例进行分组
Group instances based on NA values in r
我正在读取一个 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)。我想要得到的是一个由这些实例组成的数据框,这样我就可以将它们导出到文件中,并对这些文件单独进行 运行 分析。输出示例可以是
> A
> 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)
我是不是漏掉了什么?
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)
}
重新创建示例数据:
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 列(位置)缺失的所有观察结果。等等。
我正在读取一个 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)。我想要得到的是一个由这些实例组成的数据框,这样我就可以将它们导出到文件中,并对这些文件单独进行 运行 分析。输出示例可以是
> A
> 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)
我是不是漏掉了什么?
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)
}
重新创建示例数据:
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 列(位置)缺失的所有观察结果。等等。