计算R中数据帧中ID的出现次数

时间:2019-05-29 22:42:30

标签: r dataframe count

我有一个大约有6000个对象的数据框,如下所示: enter image description here

V1和V2是彼此通信的人的ID(从V1到V2的消息),而V3可以忽略。我试图找出与某人通信的人数,即ID在V1或V2列中出现的次数(我删除了重复项)。我可以使用count函数执行此操作吗?如果可以,怎么办?

2 个答案:

答案 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)。)