来自?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_df1
和tmp_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]]))
答案 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