使用R中数据框中的多列创建列联表
Posted
技术标签:
【中文标题】使用R中数据框中的多列创建列联表【英文标题】:Creating a contingency table using multiple columns in a data frame in R 【发布时间】:2016-02-01 00:44:38 【问题描述】:我有一个如下所示的数据框:
structure(list(ab = c(0, 1, 1, 1, 1, 0, 0, 0, 1, 1), bc = c(1,
1, 1, 1, 0, 0, 0, 1, 0, 1), de = c(0, 0, 1, 1, 1, 0, 1, 1, 0,
1), cl = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 2)), .Names = c("ab", "bc",
"de", "cl"), row.names = c(NA, -10L), class = "data.frame")
cl 列表示聚类关联,变量 ab、bc 和 de 携带二进制答案,其中 1 表示是,0 - 否。
我正在尝试创建一个表交叉表簇以及数据框中的所有其他列,即 ab、bc 和 de,其中簇成为列变量。想要的输出是这样的
1 2 3
ab 1 3 2
bc 2 3 1
de 2 3 1
我尝试了以下代码:
with(newdf, tapply(newdf[,c(3)], cl, sum))
这为我提供了一次只交叉制表一列的值。我的数据框有 1600 多列和 1 个簇列。有人可以帮忙吗?
【问题讨论】:
看来你可以试试aggregate
; aggregate(. ~ cl, newdf, sum)
?
alexis_laz...感谢您的简单执行。这真的很好,但是由于我当前的数据集有 1600 多个变量,因此一次读取所有变量有点困难。
【参考方案1】:
使用dplyr
的一种方法是:
library(dplyr)
df %>%
#group by the varialbe cl
group_by(cl) %>%
#sum every column
summarize_each(funs(sum)) %>%
#select the three needed columns
select(ab, bc, de) %>%
#transpose the df
t
输出:
[,1] [,2] [,3]
ab 1 3 2
bc 2 3 1
de 2 3 1
【讨论】:
【参考方案2】:在base
R:
t(sapply(data[,1:3],function(x) tapply(x,data[,4],sum)))
# 1 2 3
#ab 1 3 2
#bc 2 3 1
#de 2 3 1
【讨论】:
【参考方案3】:您的数据采用半长半宽格式,而您希望它采用全宽格式。如果我们首先将其转换为全长格式,这是最简单的:
library(reshape2)
df_long = melt(df, id.vars = "cl")
head(df_long)
# cl variable value
# 1 1 ab 0
# 2 2 ab 1
# 3 3 ab 1
# 4 1 ab 1
# 5 2 ab 1
# 6 3 ab 0
然后我们可以把它变成宽格式,使用sum
作为聚合函数:
dcast(df_long, variable ~ cl, fun.aggregate = sum)
# variable 1 2 3
# 1 ab 1 3 2
# 2 bc 2 3 1
# 3 de 2 3 1
【讨论】:
【参考方案4】:您还可以将tidyr:gather
或reshape2::melt
和xtabs
组合在一起来生成列联表
library(tidyr)
xtabs(value ~ key + cl, data = gather(df, key, value, -cl))
## cl
## key 1 2 3
## ab 1 3 2
## bc 2 3 1
## de 2 3 1
如果你喜欢使用管道
df %>%
gather(key, value, -cl) %>%
xtabs(value ~ key + cl, data = .)
【讨论】:
【参考方案5】:只需按照 dickoa 写的代码使用 dplyr 的 pivot_longer(取代收集)进行更新:
library(dplyr)
df %>%
pivot_longer(cols = ab:de,
names_to = "key",
values_to = "value") %>%
xtabs(value ~ key + cl, data = .)
【讨论】:
以上是关于使用R中数据框中的多列创建列联表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 r 中的 ROCR 包绘制 ROC 曲线,*只有分类列联表*