簡體   English   中英

如何使用美元符號運算符 $ 來引用列表中的元素 *inside* R 中的列表(或 tibble 列,如果不同的話)?

[英]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.

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