簡體   English   中英

根據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列(位置)的所有觀察值。 等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM