R:拆分列和获取类别值之和的更简单方法

qlzsbp2j  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(142)

我有一个数据框,其中每一行是一个观察,最后一列被称为“重叠”,显示来自不同数据集的观察,这些观察与这个数据框中的观察同时发生。
这些结果来自于我之前提出的一个问题,即如何从数据框中获取重叠数据。
所有这些重叠的观察结果都被连接到一个单独的列中,如下所示:

[1] "1_hands:N:1.768,1_hands:N:3.343,2_body:N:14.272"                                                                                                                                  
 [2] "1_hands:CH2:4.021,2_body:N:14.272"                                                                                                                                                
 [3] "1_hands:N:1.862,2_body:N:4.825"                                                                                                                                                   
 [4] "1_hands:CH2:1.978,2_body:N:4.825,2_body:CH1:1.075"                                                                                                                                
 [5] "1_hands:CH1:0.821,1_hands:N:1.417,1_hands:N:2.213,2_body:N:5.485"                                                                                                                 
 [6] "1_hands:CH1:3.557,2_body:N:3.519"                                                                                                                                                 
 [7] "1_hands:CH1:3.557,1_hands:N:1.249,2_body:N:3.519"                                                                                                                                 
 [8] "1_hands:CH1:4.896,2_body:CH1:3.308"                                                                                                                                               
 [9] "1_hands:CH1:4.896,2_body:CH1:3.308,2_body:N:1.67"                                                                                                                                 
[10] "1_hands:CH1:4.896,2_body:N:1.67,2_body:CH1:5.288"

每个观测由“,"分隔。“:“分隔观测的不同元素。例如观测:
1_双手:N:1.768
会被这样划分:
1手=类别
N =数值
1.768 =持续时间
我想做的是,得到每个类别和值的持续时间总和,本质上,我想把每个“1_hands:N:X”的持续时间加起来。
一种方法是使用stringr包,我可以使用各种str_split函数,通过分隔符“,”和“:“连续分解观察结果,最终得到一列特定类别和值的持续时间值,然后我可以得到其总和。
但是,它的效率非常低,而且我必须对多个数据集执行此操作。
有没有更简单的方法来做这件事?有没有可能循环通过这些数据,只是得到我需要的总和,而不把它分解成多组 Dataframe ?

1u4esq0p

1u4esq0p1#

不确定您要达到的确切效率,但此解决方案应该相当快

library(dplyr)
library(data.table)
library(stringr)
library(purrr)

df1 <- your_data[1:5,1]
df2 <- your_data[6:10,1]

myFun <- function(data){
  temp <- data.table(vars = data)[, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed = TRUE)))] %>% na.omit()
  temp <- setDT(tstrsplit(temp$vars, ":", fixed = TRUE, names = c("category", "value", "duration")))
}

dt <- list(df1, df2) %>%
  purrr::map(~ myFun(.x)) %>%
  rbindlist()
dt <- dt[, duration := as.numeric(duration)]

dt_sum <- dt[,.(durSum = sum(duration)), by = c("category", "value")]
zujrkrfu

zujrkrfu2#

请检查以下代码

数据

df <- data.frame(string=c("1_hands:N:1.768,1_hands:N:3.343,2_body:N:14.272",
                          "1_hands:N:1.768,1_hands:N:3.343,2_body:N:14.272",                                                                                                                                  
                          "1_hands:CH2:4.021,2_body:N:14.272",                                                                                                                                                
                          "1_hands:N:1.862,2_body:N:4.825",                                                                                                                                                   
                          "1_hands:CH2:1.978,2_body:N:4.825,2_body:CH1:1.075",                                                                                                                                
                          "1_hands:CH1:0.821,1_hands:N:1.417,1_hands:N:2.213,2_body:N:5.485",                                                                                                                 
                          "1_hands:CH1:3.557,2_body:N:3.519",                                                                                                                                                 
                          "1_hands:CH1:3.557,1_hands:N:1.249,2_body:N:3.519",                                                                                                                                 
                          "1_hands:CH1:4.896,2_body:CH1:3.308",                                                                                                                                               
                          "1_hands:CH1:4.896,2_body:CH1:3.308,2_body:N:1.67",                                                                                                                                 
                          "1_hands:CH1:4.896,2_body:N:1.67,2_body:CH1:5.288"))

编号

df %>% 
  tidyr::extract(string, into = c('category','value','duration'), regex = '(.*):(.*):(.*)') %>% 
  group_by(category, value) %>% summarise(duration=sum(as.numeric(duration)))

创建于2023年1月27日,使用reprex v2.0.2

输出

# A tibble: 5 × 3
# Groups:   category [2]
  category value duration
  <chr>    <chr>    <dbl>
1 1_hands  CH1      22.6 
2 1_hands  CH2       6.00
3 1_hands  N        17.0 
4 2_body   CH1      13.0 
5 2_body   N        68.3

相关问题