【问题标题】:Separating cbinded data.frames into the original data.frames in R将 cbinded 的 data.frames 分离为 R 中的原始 data.frames
【发布时间】:2020-07-13 18:52:43
【问题描述】:

假设我只能访问下面的cbinded data.frame r。因为cbinding之前的原始data.frames中的变量名是一样的,是否可以将r分离到原始data.frames中?

注意。这只是一个玩具示例,功能性解决方案值得赞赏。

# Original data.frames:

c1 <- data.frame(study.name = c(1,1,2,3), mod.s=c(3,3,1,2), mod.g=c(1,1,3,1))
c2 <- data.frame(study.name = c(1,1,2,3), mod.s=c(3,3,2,1), mod.g=c(1,2,3,2))

r <- cbind(c1, c2[-1]) # The only available cbined data.frame

【问题讨论】:

  • 最好不要创建同名的data.frame
  • 这是一个非常微妙和错误的问题,因为每次您可能进行一些转换时,由于使用make.unique的data.frame的属性,重复的列可能会得到一个后缀@
  • 预期的并不完全清楚。但是,最好有唯一的名称,即lst1 &lt;- list(names(c1), names(c2)); lst2 &lt;- relist(make.unique(do.call(c, lst1)), lst1); names(c1) &lt;- lst2[[1]]; names(c2) &lt;- lst2[[2]]
  • 是的,我在这里,我只是在寻找一种没有错误的方法来拆分,因为。一旦创建了r,就没有太多关于它来自哪个数据的信息,除非它基于列模式。我会创建一个 list 的 data.frame 并将其用于进一步拆分
  • @akrun,你可能知道this吗?

标签: r list function loops dataframe


【解决方案1】:

如果我们将其保存在listcbind 中,则有一种识别方式

lst1 <- list(c1, c2[-1])
r <- do.call(cbind, lst1)
split.default(r,  rep(seq_along(lst1), sapply(lst1, ncol)))

【讨论】:

  • @rnorouzian 是的,我们可以将split.default(r, names(r)) 转换为data.frames 的list,即在这里你会得到一个带有mod.gmod.sstudy.name 的data.frame作为单独的数据集
  • @rnorouzian 可能对你有用names(which(sapply(split.default(r[-1], names(r)[-1]), function(x) all(!colSums(!aggregate(.~ study.name, transform(x, study.name = r$study.name), FUN = is.constant)[-1])))))# [1] "mod.s"
  • @rnorouzian 或使用by names(which(sapply(split.default(r[-1], names(r)[-1]), function(x) all(do.call(cbind, by(x, r$study.name, FUN = function(y) apply(y, 2, is.constant))))))) [1] "mod.s"
  • @rnorouzian colSums 可能会更快,但我们也在使用 aggregate 应该会减慢速度
  • @rnorouzian 如果您检查我的代码,我使用 spit.default(r[-1], names(r)[-1]) 删除了分组列
猜你喜欢
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多