我想将具有多个分类变量的表格以及二进制实验结果的摘要转换为长格式,以便轻松运行逻辑回归模型。
有没有一种简单的方法可以做到这一点,不仅仅是使用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
谢谢!
答案 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
的列,其中包含原始success
或fail
列。
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(并删除无关的value
和variable
列...)
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.