【问题标题】:Converting Summary Table of Binary Outcome to Long Tidy DataFrame将二进制结果的汇总表转换为 Long Tidy DataFrame
【发布时间】:2017-01-11 22:10:54
【问题描述】:

我想将包含多个分类变量以及二进制实验结果摘要的表格转换为长格式,以便轻松运行逻辑回归模型。

是否有一种简单的方法可以做到这一点,而不仅仅是用rep() 制作一堆向量,然后将它们组合成一个dataframe?理想情况下,我想要一个自动执行此操作的函数,但也许我只需要自己制作。

例如,如果我从这个汇总表开始:

test   group    success  n 
A      control  1        2
A      treat    2        3
B      control  3        5
B      treat    1        3

我希望能够将其切换回以下格式:

test   group     success
A      control   1
A      control   0
A      treat     1
A      treat     1
A      treat     0
B      control   1
B      control   1
B      control   1
B      control   0
B      control   0
B      treat     1
B      treat     0
B      treat     0

谢谢!

【问题讨论】:

标签: r data-manipulation data-munging


【解决方案1】:

reshape 包是你的朋友,在这里。在这种情况下,melt()untable() 可用于规范化数据。

如果示例摘要 data.frame 位于名为 df 的变量中,则缩写为:

# replace total n with number of failures
df$fail = df$n - df$success
df$n = NULL

# melt and untable the data.frame
df = melt(df)
df = untable(df, df$value)

# recode the results, e.g., here by creating a new data.frame
df = data.frame(
  test = df$test, 
  group = df$group, 
  success = as.numeric(df$variable == "success")
)

这是一个非常普遍的问题的一个很好的例子。这个想法是反向计算交叉表基础的数据列表。给定交叉表,反向计算的数据列表对于每个数据都有一行,并且包含每个数据的属性。 Here is a post to the inverse of this question.

用“数据极客”的说法,这是一个将表格数据放入第一范式的问题——如果这对任何人都有帮助的话。您可以在 Google 上搜索数据规范化,这将帮助您设计敏捷的 data.frames,这些数据框架可以以多种不同的方式进行交叉制表和分析。

详细地说,要使melt()untable() 在这里工作,需要稍微调整原始数据以包括fail(失败次数)而不是总数n,但这很简单:

df$fail <- df$n - df$success
df$n <- NULL

给出:

  test   group success fail
1    A control       1    1
2    A   treat       2    1
3    B control       3    2
4    B   treat       1    2

现在我们可以“融化”桌子了。 melt() 可以反算用于创建交叉表的原始数据列表。

df <- melt(df)

在这种情况下,我们会得到一个名为 variable 的新列,其中包含“成功”或“失败”,以及一个名为 value 的列,其中包含来自原始 successfail 列的数据。

  test   group variable value
1    A control  success     1
2    A   treat  success     2
3    B control  success     3
4    B   treat  success     1
5    A control     fail     1
6    A   treat     fail     1
7    B control     fail     2
8    B   treat     fail     2

untable() 函数根据数字“计数”向量的值重复表的每一行。在这种情况下,df$value 是计数向量,因为它包含成功和失败的次数。

df <- untable(df, df$value)

将为每个数据生成一条记录,“成功”或“失败”:

    test   group variable value
1      A control  success     1
2      A   treat  success     2
2.1    A   treat  success     2
3      B control  success     3
3.1    B control  success     3
3.2    B control  success     3
4      B   treat  success     1
5      A control     fail     1
6      A   treat     fail     1
7      B control     fail     2
7.1    B control     fail     2
8      B   treat     fail     2
8.1    B   treat     fail     2

这就是解决方案。如果需要,现在可以重新编码数据以将“成功”替换为 1,将“失败”替换为 0(并删除无关的 valuevariable 列...)

  df <- data.frame(
    test = df$test, 
    group = df$group, 
    success = as.numeric(df$variable == "success")
  )

这将返回请求的解决方案,但行的排序方式不同:

   test   group success
1     A control       1
2     A   treat       1
3     A   treat       1
4     B control       1
5     B control       1
6     B control       1
7     B   treat       1
8     A control       0
9     A   treat       0
10    B control       0
11    B control       0
12    B   treat       0
13    B   treat       0

显然,如有必要,可以使用 data.frame。 How to sort a data.frame in R.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 2022-01-27
    • 2021-05-09
    • 2020-06-26
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2014-05-24
    相关资源
    最近更新 更多