R |创建一个交叉矩阵

时间:2020-09-08 18:04:14

标签: r

我不知道如何或从哪里开始,但我希望有人可以提供帮助。这是我第一次使用R,因此即使在其中查找关键字或推荐内容也会很有帮助。

我的数据框如下:

set.seed(1)
df <- data.frame(
  X = sample(c(1, 2, 3), 50, replace = TRUE),
  Y = sample(c(1, 2, 3), 50, replace = TRUE))

我想得到一个这样的交叉表:

enter image description here

使用

length(which(df$X ==  & df$Y == ))

我可以用R计算数据并将其填写到我的Excel工作表中,但必须有一个更好的选择。 预先谢谢你。

2 个答案:

答案 0 :(得分:3)

尝试此base R解决方案:

#Data
set.seed(1)
df <- data.frame(
  X = sample(c(1, 2, 3), 50, replace = TRUE),
  Y = sample(c(1, 2, 3), 50, replace = TRUE))
#Code
addmargins(table(df$X,df$Y))

输出:

       1  2  3 Sum
  1    6  7  5  18
  2    4  6  9  19
  3    5  5  3  13
  Sum 15 18 17  50

您还可以像这样更改变量的顺序:

#Code2
addmargins(table(df$Y,df$X))

输出:

       1  2  3 Sum
  1    6  4  5  15
  2    7  6  5  18
  3    5  9  3  17
  Sum 18 19 13  50

要导出到MS Excel,请使用以下代码:

library(xlsx)
#Transform to dataframe
d1 <- as.data.frame.matrix(addmargins(table(df$X,df$Y)))
#Export
write.xlsx(d1,file='myexample.xlsx','Sheet1')

答案 1 :(得分:1)

如果数据只有两列,只需将data.frame对象传递到table

addmargins(table(df))

如果数据包含多于两列,则可以在传递给table()之前对它的变量进行子集化。

addmargins(table(df[c("X", "Y")]))

您还可以将formula传递给xtabs()

addmargins(xtabs( ~ X + Y, df))

以上所有给予

     Y
X      1  2  3 Sum
  1    5  6  3  14
  2    2  6  6  14
  3   13  4  5  22
  Sum 20 16 14  50

要将表格导出到excel文件,可以使用write.xlsx()中的openxlsx

library(openxlsx)
tab <- addmargins(xtabs( ~ X + Y, df))
write.xlsx(tab, "foo.xlsx")
相关问题