2017-05-13 36 views
1

我想找到一個更好的方式來摺疊列表到基於在R的邏輯功能的數據框下面是對我工作重複的例子:在R中使用列表:對循環說不?

a <- data.frame(foo = c(1:3), bar = c(letters[1:3])) 
bazL <- list(c("a", "z", "g"), NULL, "c") 

a$baz <- NULL 
for(i in 1:length(a$foo)) { 
    a$baz[i] <- (bazL[[i]] > 0)[1] 
} 

在我的使用情況下,每個列表項對應於一個數據幀行。我想知道相應的列表項是否爲空。我確信有比上述方法更好的方法。

你會怎麼做?

回答

2

我們可以使用Filterlist

Filter(Negate(is.null), bazL) 

或用於過濾掉null元素獲得邏輯向量

lengths(bazL)>0 
#[1] TRUE FALSE TRUE 
+1

簡單而有效。我沒有測試過濾器功能,但是不會和未列表一樣嗎? – Simon

+0

@Simon如果你在'vector'列表中使用'unlist',它會改變它單個'vector'。 'Filter'應用於'data.frame'或'list'來刪除單個組件,即基於功能條件的列或列表元素 – akrun

3

您可以使用is.null檢查每個項目爲空或不

#a$baz = 
!sapply(bazL, is.null) 
#[1] TRUE FALSE TRUE 
+1

不錯的答案。這將很好地概括我將列入名單的其他工作。 – Simon

1

您可以使用purrr軟件包提供的map函數。例如,

library(dplyr) 
library(purrr) 

a <- mutate(a, baz = map(bazL, ~ !is.null(.x))) 

這裏map發生在bazL因爲它遍歷列表(不過要小心,如果數據幀a有一個名爲bazL,列mutate會認爲你是指的是bazL,而不是全局定義一個),並將is.null函數應用於bazL的每個元素,然後使用!進行否定。對於bazL的每個元素,.x只是一個佔位符,我們使用公式接口。

+0

非常好用的purr包。 – Simon