为什么在这两种使用 apply & lapply 之间存在不同的强制行为
Why there is a different coercion behaviour between these two use of 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 将它们保留为数字。
我想了解为什么会发生这种情况,以避免将来出现这种情况。
apply
采用 matrix
个参数。 data.frame
s 将在完成任何其他操作之前被强制转换为 matrix
。因此,所有内容都转换为同一类型 (character
)。
lapply
采用 list
个参数。因此它将 data.frame
强制转换为 list
并且不必转换参数。
我需要从 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 将它们保留为数字。
我想了解为什么会发生这种情况,以避免将来出现这种情况。
apply
采用 matrix
个参数。 data.frame
s 将在完成任何其他操作之前被强制转换为 matrix
。因此,所有内容都转换为同一类型 (character
)。
lapply
采用 list
个参数。因此它将 data.frame
强制转换为 list
并且不必转换参数。