与R的共同因素的分数

问题描述 投票:0回答:1

我正在处理一个棘手的问题。假设我有以下数据。

df <- data.frame(matrix(ncol = 0, nrow = 7))
df$x <- factor(c("blue","blue","red","red","green","green","black"))
df$y <- factor(c("A","B","A","C","B","C","A"))
df$z <- c(1998, 1998, 1998, 1998, 1999, 2000, 2001)

我们可以看到A和B的共同点是蓝色 但不是红色或黑色。A和C的共同点是红色,但不是蓝色、绿色或黑色。以此类推,我们可以看到A和B有蓝色的共同点,但没有红色或黑色的共同点,A和C有红色的共同点,但没有蓝色、绿色或黑色的共同点。

我想生成一个矩阵,对字母的颜色比例进行打分。i,j 在它们所占的所有颜色(但不包括任何一个字母未占的颜色)的联合中,它们有共同的颜色。换句话说,对角线将是字母的数目 i 占总,而离对角线将是颜色字母的份额。i 共占 j 对于所有 i,j.

我可以对每一对A,B分别做这样的处理。

df.A <- df[df$x %in% unique(df$x[df$y=="A"]),] # number of rows occupied by A 

df.B <- df[df$x %in% unique(df$x[df$y=="B"]),] # number of rows occupied by B

length(df.A$y[df.A$y=="B"]) # number of A's rows occupied by B

length(df.A$y[df.A$y=="B"]) / (length(df.A$y[df.A$y=="A"])) # proportion of times B agrees with A; i.e. (B|A) / A

在这个例子中,我们发现A共占据了三种颜色,B共占据了两种颜色。在这些颜色中,A和B只有一个共同点。在A所占的所有颜色中(n=3,不是整个n=6的集合),B只有一个重合,比例为0.333。

在我的实际数据中,有上千行和上百个因子级别,所以不可能用手做所有的排列组合。但是我想了很多办法,也没办法写出一个函数来做。我想一定有一个直接的解决方案,但我忽略了。请帮助我

更新: 感谢@Ian Campbell和@thelatemail,解决方案很简单。

t(table(df[,1:2])) %*% table(df[,1:2])

或者 crossprod(table(df$x, df$y))

回答我自己剩下的问题,我可以通过简单的服用获得我想要的比例。

x <- t(table(df[,1:2])) %*% table(df[,1:2])

x / diag(x)
r dataframe apply
1个回答
4
投票

我喜欢用线性代数来做某件事的时候。

t(table(df[,1:2])) %*% table(df[,1:2])
   y
y   A B C
  A 3 1 1
  B 1 2 1
  C 1 1 2

编辑。 正如@thelatemail所提到的,有一个内置的(可能更快)功能。

crossprod(table(df$x, df$y))

    A B C
  A 3 1 1
  B 1 2 1
  C 1 1 2
© www.soinside.com 2019 - 2024. All rights reserved.