【问题标题】:Convert string to dictionary in R将字符串转换为R中的字典
【发布时间】:2022-12-06 00:59:18
【问题描述】:

我有一个带有类似字典的字符串的数据框列。

data = data.frame(date = c('2022-12-01', '2022-12-02'), 
           code = c("{\"551\":4,\"181\":4,\"180\":4,\"181\":4}",
                    "{\"321\":14,\"181\":4,\"230\":4,\"189\":12}"))

如果“字典”以18开头,我的目标是计算总数。

例如,第一行2022-12-01,共有三项以18开头,所以总数为4+4+4 =12。 对于第二行2022-12-02,有两项以18开头,所以总数是4+4+12=16

我试过strsplit(data$code, "\\W"),它在每个分隔符上分开;或strsplit(data$code, ","),但无法将其存储为字典类型结构。

我觉得在将字符串转换为字典后,然后过滤以18开头的名称是可行的,但不知道如何开始。感谢您的意见!

【问题讨论】:

    标签: r string dictionary


    【解决方案1】:

    我首先制作一个 data.frame,其中每一行都是一个 {name, value} 对。为此,我首先将这些对分成行,然后将名称和值分成单独的列。然后我解析文本以仅保留数字。最后,我们按日期汇总表,将名称以“18”开头的那些值相加。

    library(tidyverse)
    
    data %>% 
      separate_rows(code, sep = ',') %>% 
      separate(code, sep = '":', into = c('name', 'value')) %>% 
      mutate(across(c(name, value), parse_number)) %>% 
      group_by(date) %>% 
      summarise(result = sum(value[substr(name, 1, 2) == "18"]))
    

    【讨论】:

      【解决方案2】:
      data = data.frame(date = c('2022-12-01', '2022-12-02'), 
                 code = c("{"551":4,"181":4,"180":4,"181":4}",
                          "{"321":14,"181":4,"230":4,"189":12}"))
      
      data$count <- lapply(data$code,jsonlite::fromJSON) |> sapply(
        (x) sum(unlist(x)[grep("^18", names(x))]) )
      
      data
      #>         date                                code count
      #> 1 2022-12-01   {"551":4,"181":4,"180":4,"181":4}    12
      #> 2 2022-12-02 {"321":14,"181":4,"230":4,"189":12}    16
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多