【问题标题】:Recursively apply lapply in R在 R 中递归应用 lapply
【发布时间】:2016-07-31 05:52:18
【问题描述】:

出于好奇,我正在测试递归 lapply 是否给我与手动应用函数相同的结果。我发现 lapply 行为不规律。所以,这就是我所做的:

示例 1:

m<-c(2,3,4)
n<-c(5,6,3)
o<-c(1,1,1.5)
dc<-data.frame(m,n,o)

现在,让我们来分析一下有趣的部分:

lapply(dc,mode)

给予:

lapply(dc,mode)
$m
[1] "numeric"

$n
[1] "numeric"

$o
[1] "numeric"

让我们分别比较上面的结果运行模式,比如“m”。

  mode(dc$m)

我明白了:

"numeric"

其他人也一样。这一切都很好,因为我们有原子向量。

现在,让我们分析另一个例子:

示例 2:

a<-c(2,3,4,5,5,3)
b<-c(0,1,1,0,1,0)
b<-factor(b,levels = c(0,1),labels = c("F","M"))
c<-c("Hello","Hi")
datacheck<-data.frame(a,b,c)

现在,我将“str”函数分别应用于 a、b 和 c。

str(datacheck$b)
 Factor w/ 2 levels "F","M": 1 2 2 1 2 1
str(datacheck$c)
 Factor w/ 2 levels "Hello","Hi": 1 2 1 2 1 2
str(datacheck$a)
 num [1:6] 2 3 4 5 5 3

这一切都很好,因为 b 和 c 是因素。 "a" 只是一个数字数组。

现在,当我运行 lapply 时,我得到:

 lapply(datacheck,str)
 num [1:6] 2 3 4 5 5 3
 Factor w/ 2 levels "F","M": 1 2 2 1 2 1
 Factor w/ 2 levels "Hello","Hi": 1 2 1 2 1 2
$a
NULL

$b
NULL

$c
NULL

我的问题是:当我们独立运行 str() 命令时,为什么 $a、$b 和 $c 为 NULL 而不是数字?我在 SO 上环顾四周,还阅读了 ?lapply,但找不到答案。

感谢您的想法。

【问题讨论】:

    标签: r lapply


    【解决方案1】:

    我们需要使用class

    lapply(datacheck, class)
    

    这会返回一个list,但如果我们需要一个vector

    sapply(datacheck, class)
    #       a         b         c 
    #"numeric"  "factor"  "factor" 
    

    如果我们需要将str 作为字符输出,我们可以使用capture.output 作为str 只打印输出。

    lapply(datacheck, function(x) trimws(capture.output(str(x))))
    #$a
    #[1] "num [1:6] 2 3 4 5 5 3"
    
    #$b
    #[1] "Factor w/ 2 levels \"F\",\"M\": 1 2 2 1 2 1"
    
    #$c
    #[1] "Factor w/ 2 levels \"Hello\",\"Hi\": 1 2 1 2 1 2"
    

    通过检查

    class(str(datacheck$a))
    num [1:6] 2 3 4 5 5 3
    #[1] "NULL"
    

    我们得到一个 NULL 作为输出,这就是 lapply 显示 NULL 的原因

    lapply(datacheck, str)
    

    通过查看str的源代码

     methods(str)
     #[1] str.data.frame* str.Date*       str.default*    str.dendrogram* str.logLik*     str.POSIXt*    
    
    getAnywhere(str.default)
    ...
    ...
    
     cat(ss, sep = "\n") #just prints the output
     return(invisible())
     ...
     ...
    

    【讨论】:

    • 好的。感谢您的回复。这仍然不能回答我的问题——为什么我的 str() 得到不同的结果?
    • @akrun 教人们查看源代码通常是一件好事。但如果人们先看文档,我会很高兴...
    • @UweBlock 是的,这也是真的,老实说我没有检查文档。
    • Uwe Block 和 akrun-感谢您的回复。请注意,我选择 RStudio/R 书已经五天了。因此,在某些情况下,人们可能会阅读文档但无法应用该概念。在发布之前,我已经阅读了 ?str() 和 ?lapply 文件以及关于 SO 的几篇文章。请理解我的限制。不是每个人都像你们一样了解 R。我衷心感谢您为帮助我所做的努力。谢谢。
    • @watchtower 你不需要为精心挑选的问题找借口。学习意味着保持好奇心。玩得开心R
    【解决方案2】:

    lapply(datacheck,str)返回NULL列表的原因在help(str)中有解释:

    价值

    str 出于效率原因不返回任何内容。明显的副作用是输出到终端。

    因此,区别在于您在控制台窗口中看到的打印内容和函数实际返回的内容。使用 lapply 确实可以看到它。

    【讨论】:

    • 感谢 Uwe Block。这与 akrun 的回应相结合真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 2019-12-27
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2015-02-22
    • 2015-11-23
    • 2015-09-12
    相关资源
    最近更新 更多