为什么这两种应用和应用之间存在不同的强制行为? lapply

时间:2015-01-12 10:20:48

标签: r apply lapply

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

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

  • 将所有内容强加给角色
  • 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将它们保存为数字。

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

1 个答案:

答案 0 :(得分:1)

apply需要matrix个参数。在完成任何其他操作之前,data.frame将被强制转移到matrix。因此,将所有内容转换为相同类型(character)。

lapply需要list个参数。因此,它强制data.framelist并且不必转换参数。