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