按列拆分数据框并在每个子集中保留一组公共列

问题描述 投票:0回答:3

我有一个数据框,其中包含太多变量,我无法在 Stata 中使用,因此我试图在 R 中对其进行垂直分区,以便我可以在 Stata 中使用较小的集合。但是,我需要在每组中保留 5-10 个 id 变量(id、age、wave、weight 等),以便我可以单独使用它们或在需要时轻松合并。

作为参考,大约有 5,000 个变量,我需要它们大致以 500-1000 个变量为一组,所以就像 5 或 10 个单独的 dfs,它们都具有相同的 id 变量。

如果有人能解释如何将它分成两部分,这将使我到达某个地方,我现在会采取任何措施。

r dataframe split stata partition
3个回答
1
投票

如果我理解正确,OP 想要拆分 data.frame vertically,即按列。 id 列必须出现在每个部分中。

例如,如果一个由 3 个 id 列和 17 个变量列组成的 data.frame 将被分成 3 个部分,则生成的 data.frames 将由 3 个 id 列和 5 到 6 个变量列组成each.

这可以通过使用 base R 来实现

id_cols <-  c("id1", "id2", "id3")
n_parts <- 3L
var_cols <- setdiff(colnames(df0), id_cols)
df_parts <- split(var_cols, 
      cut(seq_along(var_cols), n_parts, labels = FALSE)) |>
  lapply(\(v) df0[, c(id_cols, v)])
df_parts
$`1`
     id1    id2    id3   V1   V2   V3   V4   V5   V6
1 id1_01 id2_01 id3_01 1.02 2.02 3.02 4.02 5.02 6.02
2 id1_02 id2_02 id3_02 1.04 2.04 3.04 4.04 5.04 6.04
3 id1_03 id2_03 id3_03 1.06 2.06 3.06 4.06 5.06 6.06
4 id1_04 id2_04 id3_04 1.08 2.08 3.08 4.08 5.08 6.08
5 id1_05 id2_05 id3_05 1.10 2.10 3.10 4.10 5.10 6.10

$`2`
     id1    id2    id3   V7   V8   V9   V10   V11
1 id1_01 id2_01 id3_01 7.02 8.02 9.02 10.02 11.02
2 id1_02 id2_02 id3_02 7.04 8.04 9.04 10.04 11.04
3 id1_03 id2_03 id3_03 7.06 8.06 9.06 10.06 11.06
4 id1_04 id2_04 id3_04 7.08 8.08 9.08 10.08 11.08
5 id1_05 id2_05 id3_05 7.10 8.10 9.10 10.10 11.10

$`3`
     id1    id2    id3   V12   V13   V14   V15   V16   V17
1 id1_01 id2_01 id3_01 12.02 13.02 14.02 15.02 16.02 17.02
2 id1_02 id2_02 id3_02 12.04 13.04 14.04 15.04 16.04 17.04
3 id1_03 id2_03 id3_03 12.06 13.06 14.06 15.06 16.06 17.06
4 id1_04 id2_04 id3_04 12.08 13.08 14.08 15.08 16.08 17.08
5 id1_05 id2_05 id3_05 12.10 13.10 14.10 15.10 16.10 17.10

结果

df_parts
是一个列表,其中包含3个data.frames作为列表元素,如图所示。

数据

可重现的样本数据集由

创建
nr <- 5L
ni <- 3L
nc <- 17L
df0 <- cbind(
  outer(seq(ni), seq(nr), sprintf, fmt = "id%i_%02i") |>
    t() |>
    as.data.frame() |>
    setNames(sprintf("id%i", seq(ni))),
  outer(seq(nr) / nr / 10, seq(nc), `+`) |>
    as.data.frame()
)
df0
     id1    id2    id3   V1   V2   V3   V4   V5   V6   V7   V8   V9   V10   V11   V12   V13   V14   V15   V16   V17
1 id1_01 id2_01 id3_01 1.02 2.02 3.02 4.02 5.02 6.02 7.02 8.02 9.02 10.02 11.02 12.02 13.02 14.02 15.02 16.02 17.02
2 id1_02 id2_02 id3_02 1.04 2.04 3.04 4.04 5.04 6.04 7.04 8.04 9.04 10.04 11.04 12.04 13.04 14.04 15.04 16.04 17.04
3 id1_03 id2_03 id3_03 1.06 2.06 3.06 4.06 5.06 6.06 7.06 8.06 9.06 10.06 11.06 12.06 13.06 14.06 15.06 16.06 17.06
4 id1_04 id2_04 id3_04 1.08 2.08 3.08 4.08 5.08 6.08 7.08 8.08 9.08 10.08 11.08 12.08 13.08 14.08 15.08 16.08 17.08
5 id1_05 id2_05 id3_05 1.10 2.10 3.10 4.10 5.10 6.10 7.10 8.10 9.10 10.10 11.10 12.10 13.10 14.10 15.10 16.10 17.10

1
投票

您可以使用

split()
。如何将 df 分为 4 个部分的快速示例:

x <- split(your_data_frame, rep(1:4, length.out = nrow(your_data_frame), each = ceiling(nrow(your_data_frame)/4)))

之后,您可以将

x
的每个部分转换为(例如)df,如下所示:

x1_4 <- as.data.frame(x[1])

-4
投票

我试过你的代码 Uwe 并且它工作得很好,除非我没有将我的值分成列表的子集,只有变量名称!你能修改你的帖子吗?非常感谢:)

© www.soinside.com 2019 - 2024. All rights reserved.