[英]How can I use the dollar sign operator $ to refer to elements of lists *inside* a list in R (or a tibble column if that's different)?
我可以輸入類似
list(3, 4, 5, 4, 3, 2, 2, 3, 2, 3, 4, 1, 1, 2, 1, 3) == 3
然后回來
TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE
這很棒,因為這意味着我不必笨拙地使用lapply()
來讓 R 做我想做的事。 但是,如果我有一個列表列表,其中內部列表具有命名元素。 例如,我可以有一個書籍列表,其中每本書都是一個由$title
和$year
組成的列表。 假設我有一個名為books
的小標題,只有 1 個名為book
的列,即這本書的列表。 我將如何過濾僅在 2000 年之前出版的書籍,或mutate()
包含標題的列?
我試圖按年份過濾的天真方法是:
filter(books, book$year < 2000)
因為我希望它通過books$book
的每個元素 go 然后查看其中的$year
元素,但是,由於books$book
本身就是一個列表,因此 R 查找名為books$book$year
而不是查找books$book
中每個元素的$year
元素。 我如何在不使用 lapply() 的情況下解決這個問題?
為了完整起見,這里是我用 lapply() 做的(看起來有點笨拙)的方式:
filter(books, as.logical(lapply(books$book, function(x) x$year < 2000)))
您可以使用上面提供的代碼,但可以將其簡化為:
filter(books,sapply(book, \(x) x$year<2000))
代替
filter(books, as.logical(lapply(books$book, function(x) x$year < 2000)))
這兩個變化是:
sapply()
而不是lapply()
這將消除對as.logical()
的需要function(x)
的\(x)
快捷方式如果你真的不想使用 lapply/sapply,你可以像@akrun 建議的那樣切換到map_lgl
,盡管稍微簡化一下:
filter(books, map_lgl(book,~x$year<2000))
我們可能會使用
library(dplyr)
library(purrr)
filter(books, map_lgl(books$book, ~ .$year < 2000))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.