我有一个数据框,看起来像这样:
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")
Run Code Online (Sandbox Code Playgroud)
列cl表示簇关联,变量ab,bc&de携带二进制答案,其中1表示是和0 - 否.
我正在尝试创建一个表交叉标签集群以及数据框中的所有其他列,即ab,bc和de,其中集群成为列变量.所需的输出是这样的
1 2 3
ab 1 3 2
bc 2 3 1
de 2 3 1
Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码:
with(newdf, tapply(newdf[,c(3)], cl, sum))
Run Code Online (Sandbox Code Playgroud)
这为我提供了一次只交叉一列的值.我的数据框有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
Run Code Online (Sandbox Code Playgroud)
输出:
[,1] [,2] [,3]
ab 1 3 2
bc 2 3 1
de 2 3 1
Run Code Online (Sandbox Code Playgroud)
您的数据采用半长半格式,您希望它采用全宽格式.如果我们首先将其转换为完全长格式,这是最简单的:
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
Run Code Online (Sandbox Code Playgroud)
然后我们可以将其转换为宽格式,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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)