V1和V2是彼此通信的人的ID(从V1到V2的消息),而V3可以忽略。我试图找出与某人通信的人数,即ID在V1或V2列中出现的次数(我删除了重复项)。我可以使用count
函数执行此操作吗?如果可以,怎么办?
答案 0 :(得分:1)
使用table
:
set.seed(1)
df <- data.frame(V1 = sample(x = 50, replace = T),
V2 = sample(x = 50, replace = T))
df$V1 <- as.factor(df$V1)
df$V2 <- as.factor(df$V2)
table(df$V1)
> table(df$V1)
1 2 4 6 7 9 10 11 14 18 19 20 21 24 25 27 28 29 30 32 33 34 35 36 37 39 40 42 44 45 46 47 48 50
1 1 1 1 1 1 1 3 2 1 1 4 1 1 3 1 1 1 1 1 2 2 2 1 2 2 3 2 1 1 1 1 1 1
table(df$V2)
> table(df$V2)
3 4 5 7 8 11 12 13 15 16 17 18 20 21 22 23 24 26 31 33 34 36 38 39 40 41 42 44 45 46 49
1 1 2 1 1 1 1 3 1 1 4 1 2 2 2 2 3 1 1 2 1 2 1 3 1 1 1 4 1 1 1
答案 1 :(得分:0)
您说过“找出某人与之通信的人数” ,这表明您需要按人将其细分。
与@bbiasi类似的数据,尽管为了可读性我会降低它的大小(因为矩阵大/方形):
set.seed(2)
df <- data.frame(V1 = sample(x = 10, size = 50, replace = TRUE),
V2 = sample(x = 10, size = 50, replace = TRUE))
(m <- do.call(table, df[1:2]))
# V2
# V1 1 2 3 4 5 6 7 8 9 10
# 1 1 0 0 1 0 0 0 0 0 0
# 2 1 1 2 2 0 2 1 1 0 1
# 3 0 0 0 2 1 0 0 0 1 0
# 4 1 1 0 1 0 0 0 0 1 0
# 5 0 0 1 0 0 0 1 1 1 0
# 6 0 2 0 0 0 0 1 2 0 0
# 7 0 0 1 0 0 0 0 1 1 0
# 8 1 1 0 0 0 0 1 0 0 0
# 9 2 0 0 0 3 0 0 0 0 2
# 10 0 0 1 1 3 0 0 0 1 1
由此,您可以看到(例如)id 5(第五行)与3和7-9通信。由于我不能推断出您的数据是完全可交换的,因此ID 5(第五列)通过ID 3与通讯,并通过ID 9-10与之通信。
如果需要可交换(与对角线相同),可以使用以下命令强制使用它:
m[upper.tri(m)] <- m[upper.tri(m)] + m[lower.tri(m)]
m[lower.tri(m)] <- m[upper.tri(m)]
m
# V2
# V1 1 2 3 4 5 6 7 8 9 10
# 1 1 1 0 1 1 1 0 0 0 0
# 2 1 1 3 2 2 2 1 1 1 1
# 3 0 0 0 2 1 2 0 1 1 0
# 4 3 1 0 1 0 0 1 0 1 1
# 5 1 2 1 0 0 1 1 1 1 0
# 6 2 2 1 1 1 0 2 2 3 0
# 7 2 0 2 2 1 0 0 1 4 0
# 8 1 1 0 1 1 0 1 0 0 0
# 9 2 0 1 0 3 1 0 0 0 3
# 10 1 1 1 1 4 0 0 0 3 1
(如果列数固定,则do.call(...)
可以替换为xtabs(~V1+V2, data=df)
或table(V1=df$V1, V2=df$V2)
。)