将二元结果的汇总表转换为长整齐的DataFrame

时间:2017-01-11 22:10:54

标签: r data-manipulation data-munging

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

有没有一种简单的方法可以做到这一点,不仅仅是使用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

谢谢!

1 个答案:

答案 0 :(得分:2)

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.

在“数据极客”的说法中,这是一个将表格数据放入第一范式的问题 - 如果这对任何人都有帮助的话。您可以谷歌数据规范化,这将帮助您设计敏捷数据。框架可以通过多种不同方式进行交叉制表和分析。

详细信息,要使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()函数根据数字“count”向量的值重复表的每一行。在这种情况下,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.