从 sapply 到数据框的强制列表生成列表列而不是 R 中的 int
Coerce list from sapply to data frame produces columns of lists instead of int in R
我正在尝试 coerce/convert list
其中 returns 从 sapply
变成 dplyr::data_frame
:
data_df = tbl_df(data_frame(id=round(runif(10,1,5)),
Height=rnorm(10,65,10),
Weight=rnorm(10,100,25),
Strength=runif(10,1,10),
Age=rnorm(10,50,15)))
data2_df = tbl_df(data_frame(id=round(runif(40,1,5)),
Age=rnorm(40,50,15)))
FUN <- function(data_temp){
BMI = data_temp$Weight / ((data_temp$Height^2) * 703)
SBMI = BMI / data_temp$Strength
id = data_temp$id
data_older_friends = data2_df[data2_df$id == id & data2_df$Age > data_temp$Age,]
nOFRIENDS = 0
avgOFRIEND_AGE = NA
if (nrow(data_older_friends)>0){
nOFRIENDS = nrow(data_older_friends)
avgOFRIEND_AGE = mean(data_older_friends$Age)
}
return_df=tbl_df(data_frame(id=id,BMI=BMI,SBMI=SBMI,nOFRIENDS=nOFRIENDS,avgOFRIEND_AGE=avgOFRIEND_AGE))
return(return_df)
}
sapply_output = (sapply(1:nrow(data_df), function(x) FUN(data_df[x,])))
tbl_df(t(sapply_output))
输出为:
# A tibble: 5 x 5
id BMI SBMI nOFRIENDS avgOFRIEND_AGE
<list> <list> <list> <list> <list>
1 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
2 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
3 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
4 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
5 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
FUN(data_df)
的输出是(注意最后两列中的不准确计算):
# A tibble: 10 x 5
id BMI SBMI nOFRIENDS avgOFRIEND_AGE
<dbl> <dbl> <dbl> <int> <dbl>
1 2 2.045586e-05 3.462166e-06 5 56.34759
2 2 2.388499e-05 8.266183e-06 5 56.34759
3 3 4.001101e-05 4.119298e-06 5 56.34759
4 1 4.526758e-05 9.436741e-06 5 56.34759
5 3 2.242063e-05 3.415824e-06 5 56.34759
6 2 4.252556e-05 4.651436e-06 5 56.34759
7 5 1.728240e-05 5.536207e-06 5 56.34759
8 4 4.298384e-05 1.093979e-05 5 56.34759
9 5 3.532514e-05 5.688031e-06 5 56.34759
10 3 2.001582e-05 2.673569e-06 5 56.34759
但是,我更喜欢传统的 data_frame 列充满 dbl,而不是充满 dbl 列表的列
我尝试了 tibble::as_tibble
和 as.matrix
以及其他各种组合,但没有成功。另外,我不是在寻找 join
解决方案,因为我的实际问题涉及 2 个非常大的 tables(这里我展示了问题的玩具版本)和 "grouping" table 2 需要数据 1 中行的规范(因此按行解决方案似乎是有序的)
更新:%>% unnest
可以做到这一点
我们可以使用map
library(dplyr)
library(purrr)
res <- map_df(seq_len(nrow(data_df)), ~FUN(data_df[.x,]))
identical(res, tbl_df(t(sapply_output)) %>%
unnest)
#[1] TRUE
我正在尝试 coerce/convert list
其中 returns 从 sapply
变成 dplyr::data_frame
:
data_df = tbl_df(data_frame(id=round(runif(10,1,5)),
Height=rnorm(10,65,10),
Weight=rnorm(10,100,25),
Strength=runif(10,1,10),
Age=rnorm(10,50,15)))
data2_df = tbl_df(data_frame(id=round(runif(40,1,5)),
Age=rnorm(40,50,15)))
FUN <- function(data_temp){
BMI = data_temp$Weight / ((data_temp$Height^2) * 703)
SBMI = BMI / data_temp$Strength
id = data_temp$id
data_older_friends = data2_df[data2_df$id == id & data2_df$Age > data_temp$Age,]
nOFRIENDS = 0
avgOFRIEND_AGE = NA
if (nrow(data_older_friends)>0){
nOFRIENDS = nrow(data_older_friends)
avgOFRIEND_AGE = mean(data_older_friends$Age)
}
return_df=tbl_df(data_frame(id=id,BMI=BMI,SBMI=SBMI,nOFRIENDS=nOFRIENDS,avgOFRIEND_AGE=avgOFRIEND_AGE))
return(return_df)
}
sapply_output = (sapply(1:nrow(data_df), function(x) FUN(data_df[x,])))
tbl_df(t(sapply_output))
输出为:
# A tibble: 5 x 5
id BMI SBMI nOFRIENDS avgOFRIEND_AGE
<list> <list> <list> <list> <list>
1 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
2 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
3 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
4 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
5 <int [1]> <dbl [1]> <dbl [1]> <int [1]> <dbl [1]>
FUN(data_df)
的输出是(注意最后两列中的不准确计算):
# A tibble: 10 x 5
id BMI SBMI nOFRIENDS avgOFRIEND_AGE
<dbl> <dbl> <dbl> <int> <dbl>
1 2 2.045586e-05 3.462166e-06 5 56.34759
2 2 2.388499e-05 8.266183e-06 5 56.34759
3 3 4.001101e-05 4.119298e-06 5 56.34759
4 1 4.526758e-05 9.436741e-06 5 56.34759
5 3 2.242063e-05 3.415824e-06 5 56.34759
6 2 4.252556e-05 4.651436e-06 5 56.34759
7 5 1.728240e-05 5.536207e-06 5 56.34759
8 4 4.298384e-05 1.093979e-05 5 56.34759
9 5 3.532514e-05 5.688031e-06 5 56.34759
10 3 2.001582e-05 2.673569e-06 5 56.34759
但是,我更喜欢传统的 data_frame 列充满 dbl,而不是充满 dbl 列表的列
我尝试了 tibble::as_tibble
和 as.matrix
以及其他各种组合,但没有成功。另外,我不是在寻找 join
解决方案,因为我的实际问题涉及 2 个非常大的 tables(这里我展示了问题的玩具版本)和 "grouping" table 2 需要数据 1 中行的规范(因此按行解决方案似乎是有序的)
更新:%>% unnest
可以做到这一点
我们可以使用map
library(dplyr)
library(purrr)
res <- map_df(seq_len(nrow(data_df)), ~FUN(data_df[.x,]))
identical(res, tbl_df(t(sapply_output)) %>%
unnest)
#[1] TRUE