R Dataframe 中求和函数未捕获正确数据

k75qkfdt  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(131)

我有一个 Dataframe ,看起来像这样:

channel      start.time stop.time  vp  duration X  id  overlaps
1: 4_speech     14.183     16.554     CH1 2.371    NA 165 1_hands_CH1_1.145;2_body_CH1_1.883;2_body_N_14.272;2_body_N_4.825
2: 4_speech     21.196     22.259     CH1 1.063    NA 166 1_hands_N_1.417;2_body_CH1_1.075;2_body_N_5.485
3: 4_speech     28.001     31.518     CH1 3.517    NA 167 1_hands_CH1_3.557;1_hands_CH2_1.75;2_body_CH1_3.445;2_body_N_3.519
4: 4_speech     34.867     36.549     CH1 1.682    NA 168 2_body_CH1_3.308
5: 4_speech     41.019     42.265     CH1 1.246    NA 169 1_hands_CH1_4.896;1_hands_N_0.663;2_body_CH1_5.288
6: 4_speech     55.262     57.800     CH1 2.538    NA 170 2_body_CH1_2.494;2_body_N_6.571

前6列显示有关特定观测的信息,第7列"重叠"显示与此数据框中的观测同时出现的不同数据框中的其他观测的列表。重叠列中的每个观测的结构如下:例如,行1中的"overlaps"中的第一个观测示出了"1_hands"是通道,"CH1"是vp(一种值),并且1.145是该观测的持续时间。
我想要一个给定观测类型的所有持续时间的总和。我可以用下面的代码来获得这个结果,该代码改编自堆栈用户on a question I previously asked about how to get the overlaps data in the first place.提供的答案

library(data.table)
library(stringr)
setDT(speech_rows)
speech_rows[, id := .I]
setkey(speech_rows, id)
#self join on subset by row
speech_rows[speech_rows, durs := { 
  temp <- df[!id == i.id & start.time < i.stop.time & stop.time > i.start.time & channel == "1_hands", ]
  sum(temp$duration)
  }, by = .EACHI]

这将添加另一列'durs',该列应该显示附加到重叠列中'1_hands'字符串的所有数值的总持续时间。因此产生以下内容(删除前6列以节省空间):

overlaps                                                              durs
1: 1_hands_CH1_1.145;2_body_CH1_1.883;2_body_N_14.272;2_body_N_4.825   0.000
2: 1_hands_N_1.417;2_body_CH1_1.075;2_body_N_5.485                     1.417
3: 1_hands_CH1_3.557;1_hands_CH2_1.75;2_body_CH1_3.445;2_body_N_3.519  1.750
4: 2_body_CH1_3.308                                                    0.000
5: 1_hands_CH1_4.896;1_hands_N_0.663;2_body_CH1_5.288                  5.559
6: 2_body_CH1_2.494;2_body_N_6.571                                     0.000

但是有一个问题,sum()函数并没有捕获所有相关的字符串,在第1行,有这样一个字符串:"1_hands_CH1_1.145",它是该行中唯一的"1_hands"字符串,因此第1行durs下的值应为"1.145"。但由于某种原因,函数忽略了它。在第2行中,durs和是正确的。在第3行中,它只计算一个1_hands值,并忽略另一个。在第5行中,它正确地找到了两个1_hands值并将它们加在一起。第4行和第6行具有正确的"durs"值,因为其中没有1_hands观测值。
这非常奇怪,我不知道它有时能正确地检测到数值,但有时却不能。
问题#2:我无法指定除"1_hands"之外的其他内容,我真正想做的是获取所有1_hands_CH1值的持续时间之和,而不是所有1_hands值。为此,我假设您只需要更改"channel == 1_hands"中的字符串

temp <- df[!id == i.id & start.time < i.stop.time & stop.time > i.start.time & channel == **"1_hands"**, ]

但如果我将其更改为类似"1_hands_CH1"的值,则所有durs值都将为零,不能超过"1_hands"。
总之,我想知道为什么数学不能像我希望的那样工作,为什么我不能选择更具体的字符串。

nmpmafwu

nmpmafwu1#

这里有一种方法,你可以使用tidyverse从overlaps列中获取持续时间。你可以设置text_string等于你想要的持续时间。我已经提供了一些如何输入文本字符串的例子。下面的例子返回所有 “1_hands” 观测的持续时间。如果你只想要 “1_hands_CH1” 的持续时间,那么你只需要设置text_string <- "1_hands_CH1"

# Load tidyverse
library(tidyverse)

# Set text_string Equal To Specific String You Want Durations For
text_string <- "1_hands_[A-Z0-9]+" 

# Examples For text_string
# text_string <- "1_hands_CH1" ## example for getting 1_hands_CH1
# text_string <- ""2_body_N" ## example for getting 2_body_N
# text_string <- "1_hands_[A-Z0-9]+" ## example for getting all 1_hands
# text_string <- "2_body_[A-Z0-9]+" ## example for getting all 2_body

# df With Durations
df_with_durs <- df %>%
    as_tibble() %>%
    mutate(str_matches = str_match_all(overlaps, str_glue("{text_string}_[0-9.]+")),
           durs = map(str_matches,
                          function(x) {
                              durs <- str_remove(x, str_glue("{text_string}_"))
                              num_durs <- as.numeric(durs)
                              sum_durs <- sum(num_durs) 
                              return(sum_durs)
                              }
                          )
           ) %>% 
    unnest(cols = durs) %>%
    select(-str_matches)

# View Output
df_with_durs

# channel  start.time stop.time vp    duration X        id overlaps                                                            durs
# <chr>         <dbl>     <dbl> <chr>    <dbl> <lgl> <int> <chr>                                                              <dbl>
# 4_speech       14.2      16.6 CH1       2.37 NA      165 1_hands_CH1_1.145;2_body_CH1_1.883;2_body_N_14.272;2_body_N_4.825   1.14
# 4_speech       21.2      22.3 CH1       1.06 NA      166 1_hands_N_1.417;2_body_CH1_1.075;2_body_N_5.485                     1.42
# 4_speech       28.0      31.5 CH1       3.52 NA      167 1_hands_CH1_3.557;1_hands_CH2_1.75;2_body_CH1_3.445;2_body_N_3.519  5.31
# 4_speech       34.9      36.5 CH1       1.68 NA      168 2_body_CH1_3.308                                                    0   
# 4_speech       41.0      42.3 CH1       1.25 NA      169 1_hands_CH1_4.896;1_hands_N_0.663;2_body_CH1_5.288                  5.56
# 4_speech       55.3      57.8 CH1       2.54 NA      170 2_body_CH1_2.494;2_body_N_6.571                                     0

相关问题