подсчитать, сколько раз строка появляется в столбце

Можете ли вы придумать интуитивный способ подсчета количества раз, когда слово пробел появляется в определенном столбце? Или любое другое решение, которое является жизнеспособным. В основном я хочу знать, сколько раз была нажата клавиша пробела, однако некоторые участники допустили ошибку и нажали другие клавиши, что также будет считаться ошибкой. Поэтому мне было интересно, следует ли вместо этого использовать столбец key_resp.rt и вместо этого подсчитывать количество ответов. Если бы у вас было представление о том, как сделать и то, и другое, было бы здорово, так как мне может понадобиться использовать оба.

Я использовал следующий код, но результаты не соответствуют данным.

 Data %>% group_by(Participant, Session) %>% summarise(false_start = sum(str_count(key_resp.keys, "space")))

Вот фрагмент моих данных:

    Participant    RT     Session   key_resp.keys           key_resp.rt
       X        0.431265    1       ["space"]            [2.3173399999941466]
       X        0.217685    1           
       X        0.317435    2       ["space","space"] [0.6671900000001187,2.032510000000002]    2020.1.3    4
       Y        0.252515    1       
       Y        0.05127     2   ["space","space","space","space","space","space","space","space","space"]   [4.917419999999765,6.151149999999689,6.333714999999771,6.638249999999971,6.833514999999338,7.0362499999992,7.217724999999504,7.38576999999988,7.66913999999997]
dput(droplevels(head(Data_PVT)))
structure(list(Interval_stimulus = c(4.157783411, 4.876139922, 
5.67011868, 9.338167417, 9.196342656, 7.62448411), Participant = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = "ADH80254", class = "factor"), 
    RT = c(431.265, 277.99, 253.515, 310.53, 299.165, 539.46), 
    Session = c(1L, 1L, 1L, 1L, 1L, 1L), date = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L), .Label = "2020-06-12_11h11.47.141", class = "factor"), 
    key_resp.keys = structure(c(2L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
    "[\"space\"]"), class = "factor"), key_resp.rt = structure(c(2L, 
    1L, 1L, 1L, 1L, 1L), .Label = c("", "[2.3173399999941466]"
    ), class = "factor"), psychopyVersion = structure(c(1L, 1L, 
    1L, 1L, 1L, 1L), .Label = "2020.1.3", class = "factor"), 
    Trials = 0:5, Reciprocal = c(2.31875992719094, 3.59725169970143, 
    3.94453977082224, 3.22030077609249, 3.3426370063343, 1.85370555740926
    )), row.names = c(NA, 6L), class = "data.frame")

Ожидаемый результат:

Participant  Session  false_start
   x             1       0
   x             2       1
   y             1       2
   y             2       1
   z             1       10
   z             2       3

person CatM    schedule 20.08.2020    source источник
comment
ну, я не уверен, как воспроизвести это. В столбце key_resp.keys либо ничего нет (если ни одна клавиша не нажата, [пробел], если клавиша нажата один раз, или [пробел, пробел,...] сколько раз она была нажата. Не знаю, как воспроизвести это Key_resp.rt следует той же логике и представляет время отклика в том же формате Извините, я не могу быть более полезным.   -  person CatM    schedule 20.08.2020
comment
Извините, форматирование ужасное, не знаю, как сделать лучше.   -  person CatM    schedule 20.08.2020
comment
Я просто добавил немного, там будут записи для сеанса 1 и для сеанса 2.   -  person CatM    schedule 20.08.2020
comment
Просто добавил информацию, которую вы просили.   -  person CatM    schedule 21.08.2020
comment
В первых 6 строках dput есть только первая строка с ["space"], остальные пустые. Каков ожидаемый результат   -  person akrun    schedule 21.08.2020
comment
ожидаемый результат для них будет 1 для пробела и 0 для пустых. Один балл за пробел слова   -  person CatM    schedule 21.08.2020
comment
В этом случае я получаю ожидаемое с Data_PVT %>% mutate(false_start = str_count(key_resp.keys, "\\bspace\\b"))   -  person akrun    schedule 21.08.2020
comment
Основываясь на вашем примере кода, вот решение, которое группирует ваши переменные и подсчитывает: df %>% group_by(Participant, Session) %>% summarise(false_start = grep("\\<space\\>", key_resp.keys)).   -  person hmhensen    schedule 21.08.2020
comment
@akrun Я проверил, и кажется, что он дает двойное количество слов, возможно ли это? Я могу разделить это на 2, но я не могу проверить, так ли это у всех.   -  person CatM    schedule 21.08.2020
comment
@hmhensen Это дало мне следующую ошибку: Ошибка: столбец false_start должен иметь длину 1 (суммарное значение), а не 10   -  person CatM    schedule 21.08.2020
comment
@CatM Странно, он работает нормально, когда я запускаю его на предоставленном вами dput.   -  person hmhensen    schedule 21.08.2020
comment
Он работает с кодом akrun, но дает двойную сумму, вы не знаете, почему это может быть?   -  person CatM    schedule 21.08.2020
comment
Я получаю 1, 0, 0, 0, . для примера. Непонятно, как вы получаете double amount   -  person akrun    schedule 21.08.2020
comment
@akrun Я использовал следующее: PVT_desc ‹- Data_PVT %›% group_by(участник, сеанс) %›% mutate(false_start = str_count(key_resp.keys, \\bspace\\b)) %›% summarise(lapses = sum( ВУ >500), среднее_PVT = среднее (ВУ), среднее_получение = среднее (обратное), Ложь = сумма (ложное_начало))   -  person CatM    schedule 21.08.2020
comment
Вам не нужна группа до str_count   -  person akrun    schedule 21.08.2020
comment
Основываясь на вашем коде, я получаю одну строку сводного вывода   -  person akrun    schedule 21.08.2020
comment
Это потому, что для участника имеется более 40 строк, поэтому запрашиваемый вами вывод был только для одного участника, и, следовательно, при использовании моего кода появилась только одна строка.   -  person CatM    schedule 21.08.2020
comment
Все, кроме воспроизводимого вопроса, поощряет еще один плохой вопрос.   -  person geotheory    schedule 23.08.2020
comment
@akrun Это давало двойную сумму, поскольку фрейм данных дважды содержал одни и те же данные.   -  person CatM    schedule 23.08.2020


Ответы (1)


Мы можем использовать str_count для подсчета "space" значений для каждого Participant и Session и sum для получения суммы. Для all_false_start мы подсчитываем количество слов в нем.

library(dplyr)
library(stringr)

df %>%
  group_by(Participant, Session) %>%
  summarise(false_start = sum(str_count(key_resp.keys, '\\bspace\\b')), 
            all_false_start = sum(str_count(key_resp.keys, '\\b\\w+\\b')))
person Ronak Shah    schedule 21.08.2020
comment
Но я хочу знать, сколько раз они нажимали пробел. - person CatM; 21.08.2020
comment
Как вы определяете прессинг пространство? - person Ronak Shah; 21.08.2020
comment
Что ж, если мы говорим о нажатии только клавиши пробела, то это будет количество раз, когда слово пробел появляется в каждой строке. Если мы говорим обо всех нажатиях клавиш, то это будет количество раз отклика в переменной key_resp.rt. - person CatM; 21.08.2020
comment
Нет, мы говорим о том, что вы хотите вычислить. Я в замешательстве. В примере, которым вы поделились, недостаточно наблюдений, чтобы соответствовать ожидаемому результату. Вы можете удалить другие столбцы, которые не нужны для вопроса, и поделиться dput строками с ожидаемым результатом, чтобы вопрос стал ясным. - person Ronak Shah; 21.08.2020
comment
Вот почему я попытался создать образец необходимых столбцов во фрагменте данных. Вот как это выглядит, но с большим количеством строк на участника. - person CatM; 21.08.2020
comment
PVT_desc ‹- Data_PVT %›% mutate(false_start = str_count(key_resp.keys, \\bspace\\b)) %›% group_by(участник, сеанс) %›% summarise(lapses = sum(RT ›500), mean_PVT = среднее (RT), среднее_получение = среднее (обратное), ложь = сумма (ложное_начало)/2) - person CatM; 21.08.2020
comment
Этот код работает, но дает в два раза больше false_starts, чем должен, поэтому я делю сумму на два, не уверен, почему это так. - person CatM; 21.08.2020
comment
Можете ли вы объяснить, что вы пытаетесь рассчитать и какова логика для его расчета? Мы можем написать код для вас, но то, что вы пытаетесь рассчитать, должно быть определено вами. Также столбцы Interval_stimulus, date, psychopyVersion, Trials и Reciprocal не имеют отношения к вопросу. - person Ronak Shah; 21.08.2020
comment
Да, для этого меня интересуют только Участник, Сессия, key_resp.keys и key_resp.rt. Я хочу получить суммарное значение количества раз, когда участник нажимал клавишу, когда он не должен, то есть количество раз, когда пространство слова появляется в key_resp.keys (если нас интересует только пространство слова) или любое слово (если нас волнует, что они могли нажимать другие клавиши). Поэтому я подумал, что получу количество нажатий клавиши в строке, а затем суммирую это для всех строк для каждого участника. - person CatM; 21.08.2020
comment
@CatM Давайте пока оставим Session. Каков будет ваш ожидаемый результат для этого фрейма данных? df <- data.frame(Participant = c(1, 1, 1, 1, 1, 2, 2, 2), key_resp.keys = c('[space]', 'a', '[space][space][space]', 'a', '', 'b', '[space][space]', '')) ? - person Ronak Shah; 22.08.2020
comment
Это будет следующее, где false_start включает только пробел, а all_false_start включает все. df ‹- data.frame(Участник = c(1, 2), false_start = c(4,2), all_false_start = c(6,3)) - person CatM; 22.08.2020
comment
@CatM должен all_false_start для 1-го ID быть 5? Смотрите обновленный ответ. - person Ronak Shah; 22.08.2020
comment
all_false_start для ID 1 будет равно 6, т.е. нажатие клавиши пробела (4x) и a (2x) - person CatM; 22.08.2020
comment
@CatM Хорошо ... см. обновленный ответ. Надеюсь, на этот раз у меня получится. - person Ronak Shah; 23.08.2020