在 R 中递归应用 lapply

标签 r lapply

出于好奇,我正在测试递归 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)

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

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

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

我很感激你的想法。

最佳答案

我们需要使用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())
 ...
 ...

关于在 R 中递归应用 lapply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38681160/

相关文章:

r - R中应用函数族的命名/名称

r - 将列表中的每个元素填充到 R 中的特定长度

r - 在 lapply 中操作函数

将共享数据列中的多个值重新编码/替换为跨数据帧的单个值

用空格替换功能名称中的所有下划线

r - 调整Rmarkdown中的图形边距

r - geom_text_repel 中的条件尺寸和面孔

r - 使用 lapply/sapply 创建单级列表,无需强制

r - 从数据表 R 下载数据时更改文件名

r - 在R中按月汇总行