2014-07-05 33 views
0

我試圖從數據幀列表中刪除所有NA值。我使用它的唯一方法是在for循環中用complete.cases清理數據。有沒有另外一種方法可以和樂隊一起做,因爲我一直在試着一段時間無濟於事。這是可用的代碼。數據幀列表上使用的Complete.cases

我開始

data_in <- lapply (file_name,read.csv) 

然後有:

clean_data <- list() 
for (i in seq_along(id)) { 
    clean_data[[i]] <- data_in[[i]][complete.cases(data_in[[i]]), ] 
} 

但我試圖讓工作使用了lapply這樣一路。

comp <- lapply(data_in, complete.cases) 

clean_data <- lapply(data_in, data_in[[id]][comp,]) 

它返回這個錯誤「錯誤[.default(XJ,I):無效標類型‘列表’,」

我想知道的是一些替代品,或者如果我要對這個正確的。爲什麼最後一個例子不起作用?

非常感謝你的時間。祝你今天愉快。

回答

2

我不知道你是什麼預期與

clean_data <- lapply(data_in, data_in[[id]][comp,]) 

lapply第二個參數應該是一個適當的函數,其中的每一個構件data_in列表將一次傳遞一個。您的表情data_in[[id]][comp,]不是一項功能。我不確定你期望id來自哪裏,但lapply不會爲你創建像這樣的魔術變量。此外,此時comp現在是索引本身的列表。您沒有試圖迭代與您的data_in列表同步的列表。如果你想做到這一點在兩個獨立的步驟,更恰當的做法是

comp <- lapply(data_in, complete.cases) 
clean_data <- Map(function(d,c) {d[c,]}, data_in, comp) 

這裏我們使用Map遍歷同時data_incomp名單。它們每個都作爲參數傳遞給函數,我們可以通過這種方式進行適當的提取。否則,如果我們想要一步完成,我們可以做

clean_data <- lapply(data_in, function(x) x[complete.cases(x),]) 
+0

對不起,我忘了提及id是一個引用列表中所有段的向量,比如1:10或類似的東西。我確信這是描述身份證的一種可怕的方式......我用我的問題來看待你的觀點。 –

+0

我從來沒有使用地圖功能或聽說過它,現在將挖掘到這一點。感謝大家的幫助。這是非常讚賞。將更多地研究你的評論,但我想你已經回答了我所有的問題。 –

3

歡迎的話,請提供一些工作代碼下一次

這裏是我如何與na.omit做到這一點(因爲complete.cases只返回一個邏輯)

(dat.l <- list(dat1 = data.frame(x = 1:2, y = c(1, NA)), 
       dat2 = data.frame(x = 1:3, y = c(1, NA, 3)))) 

# $dat1 
# x y 
# 1 1 1 
# 2 2 NA 
# 
# $dat2 
# x y 
# 1 1 1 
# 2 2 NA 
# 3 3 3 

Map(na.omit, dat.l) 

# $dat1 
# x y 
# 1 1 1 
# 
# $dat2 
# x y 
# 1 1 1 
# 3 3 3 
0

你的意思是像下面那樣嗎?

> lst 
$a 
    a 
1 1 
2 2 
3 NA 
4 3 
5 4 

$b 
    b 
1 1 
2 NA 
3 2 
4 3 
5 4 

$d 
    d e 
1 NA 1 
2 NA 2 
3 3 3 
4 4 NA 
5 5 NA 

> f <- function(x) x[complete.cases(x),] 
> lapply(lst, f) 
$a 
[1] 1 2 3 4 

$b 
[1] 1 2 3 4 

$d 
    d e 
3 3 3