在R中使用数据框中的多个列创建一个备选表。

9

我有一个数据框,看起来是这样的:

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个聚类列。有人能帮忙吗?


1
看起来你可以尝试使用 aggregate 函数;aggregate(. ~ cl, newdf, sum) - alexis_laz
alexis_laz...感谢你提供了一个简单的执行方式。这真的很好,但由于我的当前数据集有1600多个变量,一次性阅读所有变量变得有点困难。 - Apricot
5个回答

8
在基础的 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

7

使用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

6

您的数据格式是半宽半长的,现在需要转换成完全宽度的。如果想要实现这一点,最好先将其转换成完全长的格式:

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

2

您还可以将tidyr:gatherreshape2::meltxtabs结合使用来生成您的列联表。

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 = .)

0

仅供更新使用dplyr的pivot_longer(它代替了gather),以下是dickoa编写的代码:

library(dplyr)

df %>% 
pivot_longer(cols = ab:de,
          names_to = "key",
          values_to = "value") %>% 
xtabs(value ~ key + cl, data = .)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接