从sapply到数据框的强制列表生成列表列而不是R

时间:2017-11-20 03:27:13

标签: r dplyr sapply tibble

我正在尝试强制/转换从list返回sapply的{​​{1}}:

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]> 的输出是(注意最后2列中的计算不准确):

FUN(data_df)

但是,我更喜欢带有dbl列的传统data_frame,而不是充满dbl列表的列

我尝试了# 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 tibble::as_tibble以及其他各种组合,但没有运气。此外,我不是在寻找as.matrix解决方案,因为我的实际问题涉及2个非常大的表(这里我已经提出了问题的玩具版本)以及&#34;分组的结果&# 34;在表2中需要来自数据1中的行的规范(因此按行顺序解决)

更新:join可以解决问题

1 个答案:

答案 0 :(得分:1)

我们可以使用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