有没有办法让dplyr的bind_cols扩展行数,就像在cbind中一样?

时间:2016-11-10 00:43:18

标签: r dplyr

来自?dplyr::bind_cols

  

这是do.call(rbind,dfs)或do.call(cbind,dfs)的通用模式的有效实现,用于将许多数据帧绑定到一个

但是,使用示例数据:

tmp_df1 <- data.frame(a = 1)
tmp_df2 <- data.frame(b = c(-2, 2))
tmp_df3 <- data.frame(c = runif(10))

命令do.call(cbind, list(tmp_df1, tmp_df2, tmp_df3))产生:

   a  b         c
1  1 -2 0.8473307
2  1  2 0.8031552
3  1 -2 0.3057430
4  1  2 0.6344999
5  1 -2 0.7870753
6  1  2 0.9453199
7  1 -2 0.6642231
8  1  2 0.9708049
9  1 -2 0.7189576
10 1  2 0.9217087

也就是说,tmp_df1tmp_df2的行会被回收以匹配tmp_df3中的行数。

dplyr

> bind_cols(tmp_df1, tmp_df2, tmp_df3)
Error in eval(substitute(expr), envir, enclos) : 
  incompatible number of rows (2, expecting 1)

我想做这样的事情的原因是因为我处于类似下面的情况:

df_normal_param <- df(mu = rnorm(10), sigma = runif(10))

df_normal_sample_list <- lapply(1:10, function(i) 
                         with(df_normal_param, 
                              data.frame(sam = rnorm(100, mu[i], sigma[i]))

我希望将用于创建df_normal_sample_list的每个条目的参数附加到输出,例如

df_normal_sample_list <- lapply(1:10, function(i) 
                         cbind(df_normal_param[i,], df_normal_sample_list[[i]]))

1 个答案:

答案 0 :(得分:2)

你在评论中认为这种行为是安全的,我强烈反对。对于这个特殊情况,这似乎是安全的,但它很可能会在未来的某个地方引发问题。这就是为什么我相信你所陈述的问题的答案(“有没有办法让dplyr的bind_cols扩展行数,比如在cbind中?”)这很简单:不,而且他们可能是故意这样构建的。

相反,我建议您在方法中更明确,只需在构建正在创建的数据时添加所需的列。例如,您可以在通话中包含该步骤(此处使用chart.userOptions来澄清将要发生的事情)

apply

返回

df <- data.frame(mu = rnorm(3), sigma = runif(3))

df_normal_sample_list <- apply(df, 1, function(x){
  data.frame(
    mu = x["mu"]
    , sigma = x["sigma"]
    , sam = rnorm(3, x["mu"], x["sigma"])
  )
})

然后,不是绑定列,而是绑定行,你可以只绑定末尾的行(也来自[[1]] mu sigma sam 1 -0.6982395 0.1690402 -0.592286 2 -0.6982395 0.1690402 -0.516948 3 -0.6982395 0.1690402 -0.804366 [[2]] mu sigma sam 1 -1.698747 0.2597186 -1.830950 2 -1.698747 0.2597186 -2.087393 3 -1.698747 0.2597186 -1.961376 [[3]] mu sigma sam 1 0.9913492 0.3069877 0.9629801 2 0.9913492 0.3069877 1.2279697 3 0.9913492 0.3069877 1.1222780

dplyr