【发布时间】:2016-11-10 21:59:12
【问题描述】:
来自?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]]))
【问题讨论】:
-
其中一个示例明确指出它不会做你想做的事:
# Rows do need to match when column-binding bind_cols(data.frame(x = 1), data.frame(y = 1:2))所以我认为这是一个有意的设计决策,很难在 dplyr 中规避。 -
tidyr::fill()是我能想到的最接近填充缺失值的方法。通常,根据排序位置将数据库表粘合在一起会产生糟糕的结果;感觉这就是安全胶带的原因。 -
就我而言,它既安全又合意。我有一个函数
f(x,y,z),它产生一个多行的数据框。我有另一个包含 x、y、z 列的数据框,因此该数据框的每一行都为函数f提供参数。我想cbind用于创建f输出的参数与f的输出稍后做一些分析。