此帖子与我以前关于从嵌套列表中提取数据的question有关,已得到解答。答案之一包含sapply
函数:
usageExist <- sapply(garden$fruit, function(f){
sapply(garden$usage, '%in%', x = names(productFruit$type[[f]][["usage"]]))})
我对data.table还是很陌生,并且应用了各种功能并且难以理解:
此特定代码行中发生了什么?
为什么cooking
运行usageExists
后在列表中出现两次?]
f
中的函数中参数sapply
的用途是什么]下面提供数据的结构和结果:
> str(productFruit)
List of 2
$ Basket: chr "DUH"
$ type :List of 3
..$ Fruit 1124:List of 3
.. ..$ ID : num 1
.. ..$ color: chr "poor"
.. ..$ usage:List of 2
.. .. ..$ eating :List of 3
.. .. .. ..$ ID : num 1
.. .. .. ..$ quality : chr "good"
.. .. .. ..$ calories: num 500
.. .. ..$ medicine:List of 3
.. .. .. ..$ ID : num 2
.. .. .. ..$ quality : chr "poor"
.. .. .. ..$ calories: num 300
..$ Fruit 1068:List of 3
.. ..$ ID : num [1:3] 1 2 3
.. ..$ color: num [1:3] 3 4 5
.. ..$ usage:List of 4
.. .. ..$ eating :List of 3
.. .. .. ..$ ID : num 1
.. .. .. ..$ quality : chr "poor"
.. .. .. ..$ calories: num 420
.. .. ..$ cooking :List of 3
.. .. .. ..$ ID : num 2
.. .. .. ..$ quality : chr "questionable"
.. .. .. ..$ calories: num 600
.. .. ..$ drinking:List of 3
.. .. .. ..$ ID : num 3
.. .. .. ..$ quality : chr "good"
.. .. .. ..$ calories: num 800
.. .. ..$ medicine:List of 3
.. .. .. ..$ ID : num 4
.. .. .. ..$ quality : chr "good"
.. .. .. ..$ calories: num 0
..$ Fruit 1051:List of 3
.. ..$ ID : num [1:3] 1 2 3
.. ..$ color: num [1:3] 3 4 5
.. ..$ usage:List of 3
.. .. ..$ cooking :List of 3
.. .. .. ..$ ID : num 1
.. .. .. ..$ quality : chr "good"
.. .. .. ..$ calories: num 49
.. .. ..$ drinking:List of 3
.. .. .. ..$ ID : num 2
.. .. .. ..$ quality : chr "questionable"
.. .. .. ..$ calories: num 11
.. .. ..$ medicine:List of 3
.. .. .. ..$ ID : num 3
.. .. .. ..$ quality : chr "poor"
.. .. .. ..$ calories: num 55
> str(garden)
Classes ‘data.table’ and 'data.frame': 5 obs. of 3 variables:
$ fruit : chr "Fruit 1124" "Fruit 100" "Fruit 1051" "Fruit 1068" ...
$ usage : chr "cooking" "cooking" "NA" "drinking" ...
$ reported: chr "200" "500" "77" "520" ...
- attr(*, ".internal.selfref")=<externalptr>
> fruitExist <- fruit %in% names(productFruit$type)
> fruitExist
[1] TRUE FALSE TRUE TRUE FALSE
> usageExist <- sapply(garden$fruit, function(f){
+ sapply(garden$usage, '%in%', x = names(productFruit$type[[f]][["usage"]]))}) # return a list of 5
> usageExist
$`Fruit 1124`
cooking cooking NA drinking medicine
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE TRUE
$`Fruit 100`
$`Fruit 100`$cooking
logical(0)
$`Fruit 100`$cooking
logical(0)
$`Fruit 100`$`NA`
logical(0)
$`Fruit 100`$drinking
logical(0)
$`Fruit 100`$medicine
logical(0)
$`Fruit 1051`
cooking cooking NA drinking medicine
[1,] TRUE TRUE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE TRUE FALSE
[3,] FALSE FALSE FALSE FALSE TRUE
$`Fruit 1068`
cooking cooking NA drinking medicine
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] TRUE TRUE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE TRUE FALSE
[4,] FALSE FALSE FALSE FALSE TRUE
$`Fruit 1`
$`Fruit 1`$cooking
logical(0)
$`Fruit 1`$cooking
logical(0)
$`Fruit 1`$`NA`
logical(0)
$`Fruit 1`$drinking
logical(0)
$`Fruit 1`$medicine
logical(0)
这篇帖子与我以前有关从嵌套列表中提取数据的问题有关,该问题已得到解答。答案之一包含一个sapply函数:usageExist
<<< [
嗯,这本质上是一个嵌套循环。 sapply(x, f)
只需将x
中的每个元素都作为参数传递给函数f
。在您的情况下,该函数只是另一个sapply
语句。
因此,
usageExist <- sapply(garden$fruit, function(f){...}
只需将
fruit
中的每个
garden
传递给函数。在您的情况下,这会影响
names(productFruit$type[[**f**]][["usage"]]
。例如,对于第一个,它将
Fruit 1124
从
garden
传递到第二个sapply,其中
productFruit$type[[f]]
从
Fruit 1124
查找
productFruit
,尤其是该列表的
usage
元素。
另一方面,第二个sapply
占用garden$usage
的每个元素,并将其传递给%in%
函数。您会获得两次cooking
,因为,正如您在str
输出中所看到的那样,该数据在该数据中出现了两次,这很有意义,因为您可以烹饪多种水果和蔬菜,而不仅仅是一种。