我需要以逐行的形式从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将它们保存为数字。
我想了解为什么会发生这种情况,以避免将来出现这种陷阱。
答案 0 :(得分:1)
apply
需要matrix
个参数。在完成任何其他操作之前,data.frame
将被强制转移到matrix
。因此,将所有内容转换为相同类型(character
)。
lapply
需要list
个参数。因此,它强制data.frame
到list
并且不必转换参数。