为什么在这两种使用 apply & lapply 之间存在不同的强制行为

Why there is a different coercion behaviour between these two use of apply & lapply

我需要从 data.frame 中逐行创建一个列表,以便稍后转换为 JSON。

我很惊讶地看到 apply 和 lapply 之间的不同行为:

这是一个例子:

df_ = data.frame( Month = month.abb[1:5],
A=rnorm(5, mean = 5, sd = 4),
B=rnorm(5, mean = 5, sd = 4),
C=rnorm(5, mean = 5, sd = 4),
D=rnorm(5, mean = 5, sd = 4),
E=rnorm(5, mean = 5, sd = 4), stringsAsFactors=F)


df1_ <- lapply(1:nrow(df_), function(i) {l_ <- as.list(df_[i, ])
    return(l_)})

df2_ <- apply(df_,1, as.list)

df1_[[1]]
$Month
[1] "Jan"

$A
[1] 8.235366

$B
[1] -0.2163872

$C
[1] 10.75159

$D
[1] 5.401502

$E
[1] 7.175394

df2_[[1]]
$Month
[1] "Jan"

$A
[1] "8.2353656"

$B
[1] "-0.2163872"

$C
[1] "10.751592"

$D
[1] " 5.4015020"

$E
[1] " 7.175394"

据我所知,它们看起来是一样的,但 apply 已将所有数字强制转换为字符,而 lapply 将它们保留为数字。

我想了解为什么会发生这种情况,以避免将来出现这种情况。

apply 采用 matrix 个参数。 data.frames 将在完成任何其他操作之前被强制转换为 matrix。因此,所有内容都转换为同一类型 (character)。

lapply 采用 list 个参数。因此它将 data.frame 强制转换为 list 并且不必转换参数。