Как сделать поворот шире и подсчитать появление пары двумя столбцами?

avatar
user35131
1 июля 2021 в 20:19
159
3
3

Проверьте фрейм данных здесь

dt <- structure(list(ID = c(1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 5, 
5, 6, 6, 6, 7, 7, 7), V1 = c("ABC", "ABC", "DEF", "GHI", "GHI", 
"GHI", "JKL", "JKL", "DEF", "ABC", "MNO", "GHI", "GHI", "ABC", 
"DEF", "DEF", "GHI", "MNO", "MNO", "ABC"), V2 = c("DEF", "MNO", 
"MNO", "JKL", "DEF", "ABC", "DEF", "ABC", "ABC", "JKL", "JKL",                                                                                               
"ABC", "DEF", "DEF", "GHI", "MNO", "MNO", "ABC", "JKL", "JKL"
)), row.names = c(NA, -20L), class = c("data.table", "data.frame"))

например, в столбце V1 ABC встречается 5 раз, а в V2 DEF также встречается 5 раз. Однако они объединены в пары три раза. Я хотел бы создать столбец подсчета, который подсчитывает их пару независимо от того, к какому столбцу (V1 или V2) они принадлежат.

Источник
Serkan
1 июля 2021 в 20:27
0

Не могли бы вы уточнить, каким должен быть окончательный результат? Вы хотите подсчитать появление (ABC, DEF) и (DEF, ABC) во всех возможных столбцах, не считая столбца ID?

user35131
2 июля 2021 в 15:35
0

Да. Я хочу подсчитать появление ABC и DEF в любом направлении. не считая столбцов ID.

Ответы (3)

avatar
Ritchie Sacramento
1 июля 2021 в 21:55
4

Вы также можете использовать table() и сложить результат и его транспонирование вместе:

tbl <- table(dt[-1]) 

(cnts <- tbl + `diag<-`(t(tbl), 0))

     V2
V1    ABC DEF GHI JKL MNO
  ABC   0   3   2   3   2
  DEF   3   0   3   1   2
  GHI   2   3   0   1   1
  JKL   3   1   1   0   2
  MNO   2   2   1   2   0

Для дедупликации и преобразования во фрейм данных:

cnts[upper.tri(cnts)] <- NA

subset(as.data.frame.table(cnts), !is.na(Freq))

    V1  V2 Freq
1  ABC ABC    0
2  DEF ABC    3
3  GHI ABC    2
4  JKL ABC    3
5  MNO ABC    2
7  DEF DEF    0
8  GHI DEF    3
9  JKL DEF    1
10 MNO DEF    2
13 GHI GHI    0
14 JKL GHI    1
15 MNO GHI    1
19 JKL JKL    0
20 MNO JKL    2
25 MNO MNO    0
user35131
2 июля 2021 в 15:46
0

Я получаю это сообщение Ошибка в t.default(tbl): аргумент не является матрицей

user35131
2 июля 2021 в 17:02
0

Я исправил эту часть сценария, а остальные прошли.

avatar
Thomas Rosa
1 июля 2021 в 20:57
3

В базе R вы можете сделать что-то вроде:

codes = unique(c(dt$V1, dt$V2))
output = data.frame(code1 = character(0), code2 = character(0), occurances = integer(0))
for(i1 in 1:length(codes)){
    code1 = codes[i1]
    for(i2 in 1:i1){
        code2 = codes[i2]
        count = sum((code1==dt$V1 & code2 == dt$V2) | (code1==dt$V2 & code2 == dt$V1))
        output = rbind(output, data.frame(code1=code1, code2=code2, occurances=count))
    }
}
output

Какие выходы:

   code1 code2 occurances
1    ABC   ABC          0
2    DEF   ABC          3
3    DEF   DEF          0
4    GHI   ABC          2
5    GHI   DEF          3
6    GHI   GHI          0
7    JKL   ABC          3
8    JKL   DEF          1
9    JKL   GHI          1
10   JKL   JKL          0
11   MNO   ABC          2
12   MNO   DEF          2
13   MNO   GHI          1
14   MNO   JKL          2
15   MNO   MNO          0
user35131
1 июля 2021 в 21:00
0

Я получаю сообщение об ошибке: объект типа «закрытие» не является подмножеством

Thomas Rosa
1 июля 2021 в 21:02
0

Является ли dt тем же кадром данных, что и в вашем примере?

avatar
ThomasIsCoding
1 июля 2021 в 20:36
5

Обновление

dt[, c(2, 3, 1)] %>%
    graph_from_data_frame(directed = FALSE) %>%
    get.adjacency(type = "upper") %>%
    graph_from_adjacency_matrix(weighted = TRUE) %>%
    get.data.frame()

дает

   from  to weight
1   ABC DEF      3
2   ABC GHI      2
3   DEF GHI      3
4   ABC JKL      3
5   DEF JKL      1
6   GHI JKL      1
7   ABC MNO      2
8   DEF MNO      2
9   GHI MNO      1
10  JKL MNO      2

Думаю, вы можете попробовать вариант igraph, как показано ниже

library(igraph)
get.adjacency(
    graph_from_data_frame(dt[, -"ID"],
        directed = FALSE
    ),
    sparse = FALSE
)

что дает

    ABC DEF GHI JKL MNO
ABC   0   3   2   3   2
DEF   3   0   3   1   2
GHI   2   3   0   1   1
JKL   3   1   1   0   2
MNO   2   2   1   2   0

Если вы хотите добавить столбец с подсчетом, вы можете попробовать

transform(
    dt,
    cnts = ave(ID, pmin(V1, V2), pmax(V1, V2), FUN = length)
)

что дает

   ID  V1  V2 cnts
 1:  1 ABC DEF    3
 2:  1 ABC MNO    2
 3:  1 DEF MNO    2
 4:  2 GHI JKL    1
 5:  2 GHI DEF    3
 6:  2 GHI ABC    2
 7:  2 JKL DEF    1
 8:  2 JKL ABC    3
 9:  2 DEF ABC    3
10:  3 ABC JKL    3
11:  4 MNO JKL    2
12:  5 GHI ABC    2
13:  5 GHI DEF    3
14:  5 ABC DEF    3
15:  6 DEF GHI    3
16:  6 DEF MNO    2
17:  6 GHI MNO    1
18:  7 MNO ABC    2
19:  7 MNO JKL    2
20:  7 ABC JKL    3
user35131
1 июля 2021 в 20:49
0

Например, вы видите строки 1 и 9. Я не хочу, чтобы это считалось дважды.

Anoushiravan R
1 июля 2021 в 21:50
0

Я собираюсь пройти сетевой анализ в следующем семестре, и для этого нам нужно выучить igraph, поэтому я думаю, что у меня будет куча вопросов, чтобы задать вам, лол.

ThomasIsCoding
1 июля 2021 в 21:50
1

@AnoushiravanR Конечно, добро пожаловать! Если бы у вас были знания в области теории графов, я думаю, вам было бы намного легче выучить igraph.

Anoushiravan R
1 июля 2021 в 22:25
0

@ThomasIsCoding Я изучал его, когда учился в старшей школе в разделе дискретной математики, но прошло так много лет. Я думаю, что я немного знаком или немного просмотрев, я мог вспомнить ключевые функции. Я нашел книгу под названием statistical analysis of network data with R, опубликованную Springer, но наша основная ссылка — networks, crowds and markets.

ThomasIsCoding
1 июля 2021 в 22:31
1

@AnoushiravanR Ха-ха, звучит интересно. Может быть, мы сможем узнать igraph вместе, если у вас возникнут вопросы igraph. Пожалуйста, пингуйте меня, если вы хотите поделиться какой-либо интересной проблемой igraph.

Anoushiravan R
1 июля 2021 в 22:37
0

@ThomasIsCoding Конечно, я предупрежу вас, прежде чем публиковать, как Анил и я, однако его вопросы в основном неразрешимы, лол. О, конечно, было бы приятно поучиться у вас. Ты на световые годы впереди меня, я должен начать с нуля :D

user35131
2 июля 2021 в 15:44
0

@ThomasIsCoding в обновлении у вас есть строки 1 и 5 для ABC и DEF, которые появляются дважды.