最近,无论关系的顺序如何,我都想计算两个变量之间关系的出现次数。换句话说,
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)
但它不起作用,任何想法如何解决这个问题?
答案 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)
一种简单的方法。您可以使用pmin
和pmax
函数。
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