AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79151275
Accepted
Chris Ruehlemann
Chris Ruehlemann
Asked: 2024-11-03 01:50:43 +0800 CST2024-11-03 01:50:43 +0800 CST 2024-11-03 01:50:43 +0800 CST

Determinar janelas de tempo sobrepostas

  • 772

Esta questão é uma continuação desta: Calcule o olhar mútuo a partir de olhares individuais .

Estou trabalhando com dados de olhar em sequências de perguntas e respostas em conversas tradicionais e quero saber quando exatamente e por quanto tempo há olhar mútuo , ou seja, uma pessoa olhando para outra pessoa e essa outra pessoa olhando de volta. A resposta à pergunta anterior lidou lindamente com sequências de perguntas e respostas nas quais havia apenas olhar mútuo entre o falante e os ouvintes, mas não consegue lidar com uma situação em que também há olhar mútuo entre os dois ouvintes.

O tipo de dados que tenho é ilustrado aqui:

   GazeID Sequ Utterance Q_by Answ_by Gaze_by Gaze_to        Role start end Gaze_pair
1:      1   55 where...?    A       B       A       B     Speaker   100 700        AB
2:      2   55 where...?    A       B       B       A    Answerer     0 200        AB
3:      3   55 where...?    A       B       B       C    Answerer   230 500        BC
4:      4   55 where...?    A       B       C       B NonAnswerer   120 620        BC
5:      5   55 where...?    A       B       C       A NonAnswerer   650 700        AC

Aqui, há um olhar mútuo (i) entre Speakere , Answerermas também entre Answerere NonAnswerer, de modo que a saída desejada é esta:

   Sequ    Utterance   MG_start    MG_end    MG_dur   Gaze_pair
1: 55      where...?        100       200       100          AB
2: 55      where...?        230       500       270          BC

Tentei adaptar a solução da questão anterior, que foi construída na data.tablefunção foverlaps, para este cenário, mas recebi um erro.

NB: Pode haver, em qualquer sequência de perguntas e respostas, múltiplos olhares mútuos e pode haver olhar mútuo entre (i) Speaker_Answerer, (ii) Speaker-NonAnswerere (iii) Answerer-NonAnswerer.

Qualquer ajuda com essa questão será muito apreciada.

Dados reproduzíveis :

gazes <- structure(list(GazeID = 1:5, Sequ = c(55, 55, 55, 55, 55), Utterance = c("where...?", 
"where...?", "where...?", "where...?", "where...?"), Q_by = c("A", 
"A", "A", "A", "A"), Answ_by = c("B", "B", "B", "B", "B"), Gaze_by = c("A", 
"B", "B", "C", "C"), Gaze_to = c("B", "A", "C", "B", "A"), Role = c("Speaker", 
"Answerer", "Answerer", "NonAnswerer", "NonAnswerer"), start = c(100L, 
0L, 230L, 120L, 650L), end = c(700L, 200L, 500L, 620L, 700L), 
    Gaze_pair = c("AB", "AB", "BC", "BC", "AC")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))
  • 1 1 respostas
  • 98 Views

1 respostas

  • Voted
  1. Best Answer
    2024-11-03T02:44:46+08:002024-11-03T02:44:46+08:00

    Uma abordagem é dividir seus dados em uma lista de quadros de dados por par de olhares e calcular olhares mútuos para cada quadro de dados nessa lista. Isso é usado data.table::foverlaps()para a junção de sobreposição rápida. Como você preferir, dplyré escrito de tal forma que se conecta às suas funções de agrupamento que pegam e retornam um quadro de dados, especificamente dplyr::group_modify().

    library(data.table)
    get_mutual_gazes_pair <- function(dt, grp) {
        # split into the pair involved
        person_list <- dt |>
            group_split(Gaze_by, Gaze_to)
    
        # if no pair, no overlaps
        if (length(person_list) == 1) {
            return(data.frame(NULL))
        }
    
        # get the overlaps
        dt1 <- setDT(person_list[[1]]) |> setkey(start, end)
        dt2 <- setDT(person_list[[2]]) |> setkey(start, end)
        overlaps_dt <- foverlaps(dt1, dt2, nomatch = NA)
        overlaps_dt <- overlaps_dt[complete.cases(overlaps_dt)]
    
        # get start, end and duration
        overlaps_dt |> reframe(
            MG_start = pmax(start, i.start),
            MG_end = pmin(end, i.end),
            MG_dur = MG_end - MG_start
        )
    }
    

    Então é só uma questão de calcular todos os pares de olhares mútuos:

    library(dplyr)
    gazes |>
        group_by(Sequ, Utterance, Gaze_pair) |>
        group_modify(get_mutual_gazes_pair)
    
    #    Sequ Utterance Gaze_pair MG_start MG_end MG_dur
    #   <dbl> <chr>     <chr>        <int>  <int>  <int>
    # 1    55 where...? AB             100    200    100
    # 2    55 where...? BC             230    500    270
    

    Uma nota sobre múltiplos olhares

    Observe o uso de pmin()and pmax()em vez de min()and max(). Em seus dados de exemplo, há um olhar mútuo por enunciado. Por exemplo, Alooks at Bfrom 100to 700e B looks at Afrom 0to 200, daí a sobreposição from 100to 200. Mas se imaginarmos que a pessoa Bolhou para person Aagain from 300to 400, teríamos dois olhares mútuos por enunciado. Essa abordagem funcionará nesse caso:

    gazes2 <- gazes |>
        add_row(
            GazeID = 3, Sequ = 55, Utterance = "where...?", Q_by = "A",
            Answ_by = "A", Gaze_by = "B", Gaze_to = "A", Role = "Answerer", start = 300,
            end = 400, Gaze_pair = "AB"
        )
    gazes2 |>
        group_by(Utterance, Gaze_pair) |>
        group_modify(get_mutual_gazes_pair)
    
    #   Utterance Gaze_pair MG_start MG_end MG_dur
    #   <chr>     <chr>        <dbl>  <dbl>  <dbl>
    # 1 where...? AB             100    200    100
    # 2 where...? AB             300    400    100
    # 3 where...? BC             230    500    270
    

    Incluindo sequências sem olhares

    Em resposta ao seu comentário perguntando como garantir que todas Sequas ences sejam incluídas, mesmo que não tenham olhares mútuos, a função não sabe se cada uma Sequteve um olhar mútuo anteriormente. Em vez de introduzir o estado, acho que a abordagem mais simples é unir depois com quaisquer sequências que estejam faltando. Primeiro, vamos adicionar um novo Sequ, 66, sem olhar mútuo:

    gazes3 <- gazes |>
        add_row(
            GazeID = 3, Sequ = 66, Utterance = "where...?", Q_by = "A",
            Answ_by = "A", Gaze_by = "B", Gaze_to = "A", Role = "Answerer", start = 300,
            end = 450, Gaze_pair = "AB"
        )
    

    Então podemos apenas verificar quais Sequocorrências não estão incluídas na saída e adicioná-las, com todos os outros valores NA:

    gazes3 %>%
        group_by(Sequ, Utterance, Gaze_pair) %>%
        group_modify(get_mutual_gazes_pair) %>%
        # ^^ as before, but below is new
        bind_rows(
            anti_join(distinct(gazes3, Sequ), .)
        ) %>%
        arrange(Sequ)
    
    #    Sequ Utterance Gaze_pair MG_start MG_end MG_dur
    #   <dbl> <chr>     <chr>        <dbl>  <dbl>  <dbl>
    # 1    55 where...? AB             100    200    100
    # 2    55 where...? BC             230    500    270
    # 3    66 NA        NA              NA     NA     NA
    

    Note que precisamos %>%para isso em vez de |>como precisamos usar o placeholder de pipe .em um lugar onde o equivalente de pipe base _não seria permitido. Em qualquer caso, essa junção garante que haverá uma linha para todos os valores de Sequ.

    • 2

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve