【问题标题】:Creating mutiple tables from a dataframe using one constant variable against all other variables使用一个常量变量针对所有其他变量从数据框中创建多个表
【发布时间】:2026-01-22 01:30:01
【问题描述】:

我想实现某种循环,将数据帧中的所有变量与一个常量制成表格,该常量是另一个变量。

例如,假设我有一个包含 3 个变量的数据框,例如下面的虚拟数据,我想生成给定的表格。

df <- data.frame(V1 = factor(c("L", "L", "XL", "M", "S", "XXL")),
                 V2 = factor(c("Tall", "Medium", "Tall", "Small", "Small", "Very Tall")),
                 V3 = factor(c("Vegan", "Vegetarian", "Non-V", "Vegan", "Non-V", "Non-V")))

attach(df)

table(V3, V3)
table(V3, V2)
table(V3, V1)

我的目标是创建每个单独的表并将它们编译成一个列表。进入列表后,我可以使用匿名函数的组合进行感兴趣的计算并应用家庭电话。但是,我需要找到一种方法来在包含许多变量的大型数据集上创建这些表,而无需手动创建每个表的繁琐工作。

我尝试过使用lapplysapplyfor 循环,但似乎找不到适合我的方法。有没有一种方法可以跨所有变量创建表并将它们放入列表中?

【问题讨论】:

  • 我认为我误读了您的问题,但使用lapply 提供了额外的答案。
  • 这种方法效果很好,正是我想要的。我有点不清楚餐桌后发生了什么?我知道我们正在将表函数应用于 df 的子集,而没有我想比较的常量。 df[ , 1] 实现了什么?
  • df[, 1]table 的第二个参数,如table(df[, 2], df[, 1])

标签: r dataframe iteration


【解决方案1】:

要将一个变量与 data.frame 中的所有其他变量进行比较,然后返回一个列表,您可以像这样使用lapply

lapply(df[-1], table, df[,1])
$V2

            L M S XL XXL
  Medium    1 0 0  0   0
  Small     0 1 1  0   0
  Tall      1 0 0  1   0
  Very Tall 0 0 0  0   1

$V3

             L M S XL XXL
  Non-V      0 0 1  1   1
  Vegan      1 1 0  0   0
  Vegetarian 1 0 0  0   0

df[-1] 表示除第一个变量外的 df 中的所有变量。请注意df[,1] 中的逗号,它是返回向量而不是在table 中使用的单个元素列表所必需的。


如果你想建立一个不同变量对的表列表(v1-v2、v1-v3、v2-v3),你可以使用combn。 simple=FALSE 参数返回一个列表。

combn(df, 2, FUN=table, simplify=FALSE)
[[1]]
     V2
V1    Medium Small Tall Very Tall
  L        1     0    1         0
  M        0     1    0         0
  S        0     1    0         0
  XL       0     0    1         0
  XXL      0     0    0         1

[[2]]
     V3
V1    Non-V Vegan Vegetarian
  L       0     1          1
  M       0     1          0
  S       1     0          0
  XL      1     0          0
  XXL     1     0          0

[[3]]
           V3
V2          Non-V Vegan Vegetarian
  Medium        0     0          1
  Small         1     1          0
  Tall          1     1          0
  Very Tall     1     0          0

如果你还想自己获取每个变量的表,那么

lapply(1:2, function(i) combn(df, i, FUN=table, simplify=FALSE))

将生成一个嵌套的表格列表。

【讨论】:

  • 这是一个很好的功能,谢谢。是否可以在生成 x 个表后终止它?例如,如果我希望它在处理完所有 V1(行中)组合后停止。我只想要 V1 是行的表。干杯!
  • 对于combn,最简单的方法是计算所有表,然后对列表进行子集化。对于上述示例,您可以使用combn(df, 2, FUN=table, simplify=FALSE)[1:2]
  • 好的。再次感谢。