计算2个变量之间的关系数

时间:2016-03-27 21:04:20

标签: r count

最近,无论关系的顺序如何,我都想计算两个变量之间关系的出现次数。换句话说,

Variable1 Variable2
A          B
B          A

我应该

Variable1 Variable2 Weight 
A          B        2

我可以尝试像

这样的东西
result <- aggregate(var_to_sum, by=list(var1,var2), FUN=sum, na.rm=TRUE)

但是我不知道如何使A B等于B A

Author1 <- ifelse(var1>var2,var1,var2)

但它不起作用,任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

以下是data.table的方法。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1))。对于&#34; V1和#34;中的值这大于&#34; V2&#34;,我们分配&#34; V2&#34; as&#34; V1&#34;反之亦然。由&#34; V1&#34;组成和&#34; V2&#34;,我们得到nrow(.N),即&#34; weight&#34;。

library(data.table)
setDT(df1)[V1>V2, c("V2", "V1") := list(V1, V2)][, 
                            .(weight=.N) ,.(V1, V2)]
#   V1 V2 weight
#1:  A  B      2
#2:  C  D      2

数据

df1 <- data.frame(V1=c("A", "B", "C", "D"), 
              V2=c("B", "A", "D", "C"), stringsAsFactors = FALSE)

答案 1 :(得分:2)

由于您未提供任何样本数据,我将使用此数据集:

set.seed(1234)
data <- data.frame(var1 = sample(LETTERS[1:4], 30, replace = TRUE),
                   var2 = sample(LETTERS[1:4], 30, replace = TRUE),
                   stringsAsFactors = FALSE)

data是一个包含两列的数据框,所有条目都是&#34; A&#34;,&#34; B&#34;,&#34; C&#34;或&#34 ; d&#34;

首先,我创建一个包含标准顺序的变量然后计数的列:

data <- transform(data, comb = ifelse(var1 < var2,
                                      paste(var1, var2, sep = ":"),
                                      paste(var2, var1, sep = ":")))
counts <- as.data.frame(table(data$comb))
counts
##   Var1 Freq
## 1  A:A    3
## 2  A:B    3
## 3  A:C    2
## 4  A:D    4
## 5  B:B    4
## 6  B:C    4
## 7  C:C    3
## 8  C:D    6
## 9  D:D    1

如果您想再次为每个变量添加一列,您可以使用separate()包中的函数tidyr

counts_split <- tidyr::separate(counts, Var1, c("var1", "var2"), sep = ":")
counts_split
##   var1 var2 Freq
## 1    A    A    3
## 2    A    B    3
## 3    A    C    2
## 4    A    D    4
## 5    B    B    4
## 6    B    C    4
## 7    C    C    3
## 8    C    D    6
## 9    D    D    1

答案 2 :(得分:1)

一种简单的方法。您可以使用pminpmax函数。

df1 <- data.frame(V1=c("A", "B", "C", "D"), 
                  V2=c("B", "A", "D", "C"), stringsAsFactors = FALSE)

library(dplyr)

df1 %>% transmute(V1n=pmin(V1, V2), V2n=pmax(V1, V2)) %>% 
  group_by(V1n, V2n) %>% summarise(weight=n())
# Source: local data frame [2 x 3]
# Groups: V1n [?]
# 
#     V1n   V2n weight
#   (chr) (chr)  (int)
# 1     A     B      2
# 2     C     D      2