当前位置: 首页 > 知识库问答 >
问题:

如何在R中解包元组格式?

乌甫
2023-03-14

这是数据集。

library(data.table)

x <- structure(list(id = c("A", "B" ),
                    segment_stemming = c("[('Brownie', 'Noun'), ('From', 'Josa'), ('Pi', 'Noun')]", 
                                          "[('Dung-caroon-gye', 'Noun'), ('in', 'Josa'), ('innovation', 'Noun')]" )), 
               row.names = c(NA, -2L), 
               class = c("data.table", "data.frame" ))

x
# id                                                     segment_stemming
# 1:  A               [('Brownie', 'Noun'), ('From', 'Josa'), ('Pi', 'Noun')]
# 2:  B [('Dung-caroon-gye', 'Noun'), ('in', 'Josa'), ('innovation', 'Noun')]

我想把元组分成行。这是我的预期结果。

id             segment_stemming
A              ('Brownie', 'Noun')
A              ('From', 'Josa')
A              ('Pi', 'Noun')
B              ('Dung-caroon-gye', 'Noun')
B              ('in', 'Josa')
B              ('innovation', 'Noun')

我用R搜索了元组格式,但找不到任何线索来得出结果。

共有3个答案

步德宇
2023-03-14

下面是另一个可能的选择:

library(data.table)

dt <- structure(list(id = c("A", "B" ), segement_stemming = c("[('Brownie', 'Noun'), ('From', 'Josa'), ('Pi', 'Noun')]", "[('Dung-caroon-gye', 'Noun'), ('in', 'Josa'), ('innovation', 'Noun')]" )), row.names = c(NA, -2L), class = c("data.table", "data.frame" ))

dt2 <- dt[, c(segement_stemming = strsplit(segement_stemming, "(?<=[^']),", perl = TRUE)), by = id]
dt2[, names(dt2) := lapply(.SD, function(x) gsub("\\[|\\]", "", x))]
dt2
#>    id           segement_stemming
#> 1:  A         ('Brownie', 'Noun')
#> 2:  A            ('From', 'Josa')
#> 3:  A              ('Pi', 'Noun')
#> 4:  B ('Dung-caroon-gye', 'Noun')
#> 5:  B              ('in', 'Josa')
#> 6:  B      ('innovation', 'Noun')

由reprex包(v2.0.1)创建于2022-03-11

卢鸿博
2023-03-14

下面是一种使用分隔行的方法:

library(tidyverse)

x %>% 
  mutate(segment_stemming = gsub("\\[|\\]", "", segment_stemming)) %>% 
  separate_rows(segment_stemming, sep = ",\\s*(?![^()]*\\))")

# A tibble: 6 x 2
  id    segment_stemming           
  <chr> <chr>                      
1 A     ('Brownie', 'Noun')        
2 A     ('From', 'Josa')           
3 A     ('Pi', 'Noun')             
4 B     ('Dung-caroon-gye', 'Noun')
5 B     ('in', 'Josa')             
6 B     ('innovation', 'Noun') 

获得更好结果的一种方法是进行一些操作(unnest_-wide)。

x %>% 
  mutate(segment_stemming = gsub("\\[|\\]", "", segment_stemming)) %>% 
  separate_rows(segment_stemming, sep = ",\\s*(?![^()]*\\))") %>% 
  mutate(segment_stemming = segment_stemming %>% 
           str_remove_all("[()',]") %>% 
           str_split(" ")) %>% 
  unnest_wider(segment_stemming)

# A tibble: 6 x 3
  id    ...1            ...2 
  <chr> <chr>           <chr>
1 A     Brownie         Noun 
2 A     From            Josa 
3 A     Pi              Noun 
4 B     Dung-caroon-gye Noun 
5 B     in              Josa 
6 B     innovation      Noun 
申阳伯
2023-03-14

这里有一个使用数据的选项。表格网状

library(reticulate)
library(data.table)
setDT(x)[
  ,
  segment_stemming := gsub("(\\(.*?\\))", '\"\\1\"', segment_stemming)
][
  ,
  lapply(.SD, py_eval),
  id
]

这给了

   id            segment_stemming
1:  A         ('Brownie', 'Noun')
2:  A            ('From', 'Josa')
3:  A              ('Pi', 'Noun')
4:  B ('Dung-caroon-gye', 'Noun')
5:  B              ('in', 'Josa')
6:  B      ('innovation', 'Noun')

另一个数据。表使用strsplit的选项trimws如下

library(data.table)
setDT(x)[
  ,
  .(segment_stemming = trimws(
    unlist(strsplit(segment_stemming, "(?<=\\)),\\s+(?=\\()", perl = TRUE)),
    whitespace = "\\[|\\]"
  )),
  id
]

给予

   id            segment_stemming
1:  A         ('Brownie', 'Noun')
2:  A            ('From', 'Josa')
3:  A              ('Pi', 'Noun')
4:  B ('Dung-caroon-gye', 'Noun')
5:  B              ('in', 'Josa')
6:  B      ('innovation', 'Noun')

一些基本的R选项也应该起作用

with(
  x,
  setNames(
    rev(
      stack(
        tapply(
          segment_stemming,
          id,
          function(v) {
            trimws(
              unlist(strsplit(v, "(?<=\\)),\\s+(?=\\()", perl = TRUE)),
              whitespace = "\\[|\\]"
            )
          }
        )
      )
    ),
    names(x)
  )
)

或者

with(
  x,
  setNames(
    rev(
      stack(
        setNames(
          regmatches(segment_stemming, gregexpr("\\(.*?\\)", segment_stemming)),
          id
        )
      )
    ),
    names(x)
  )
)
 类似资料:
  • 我对pig是新手,在解析输入并将其转换成可以使用的格式时遇到了问题。输入文件包含同时具有固定字段和KV对的行,如下所示: FF1FF2FF3FF4KVP1KVP2...KVPN 完成后,我希望能够生成以下结果(在这一点上,输出格式并不重要,我只是向您展示我希望的结果): 似乎我应该可以通过分组固定场并将一袋KV对拉平来生成交叉积来做到这一点 我试着用这样的东西读这篇文章: 虽然这让我得到了我想要的

  • 我有一个大型多维数组(约1900万个元素),其中包含多个不同属性的联合概率。 数组非常稀疏,我只对概率非零的单元格感兴趣。 但是,在筛选数组中的非零元素时,我无法检索筛选值的维度名称(对应于各种属性值)。 以下是一个玩具示例: 我可以获得与某个标准匹配的单元格的索引值(此处, 但我无法使用上述索引值并找出它们是什么水果组合,因为在查找特定单元格值时,DIMNAME会被删除: 我尝试将数组转换为da

  • 问题内容: 我偶然发现以下代码: 我不明白’i,a’位,并且在Google上搜索有关’for’的信息是一种痛苦,当我尝试使用该代码尝试时,我得到了错误: :需要多个值才能解压 有谁知道它的作用或与之有关的事情,可以通过谷歌了解更多信息吗? 问题答案: 你可以通过Google搜索“元组拆箱”。可以在Python的各个地方使用它。最简单的是分配 在for循环中,其工作原理类似。如果iterable的每

  • 我正在尝试为每个组标记。这是数据集。 结构(列表(组=结构(c(1L,1L,2L,1LL,2L、1L,4L,1L,1L、2L,2L,2L),.Label=c(“p01”,“p02”),class=“factor”)),class=“data.frame”,行。名称=c(NA,-12L)) 这是预期表。在p01的情况下,预期列是从1-4中的1,然后是从6-8中的2,从11-12中的3,用于考虑连续模

  • 我的代码有一个特殊的问题。 然后它会发生在图像上出现的事情。我需要汉字列是CENTER对齐,但出于某种原因,'tcr,不工作,因为它应该是,但默认渲染器正在做它应该是。 有什么建议/帮助吗?

  • 问题内容: 在Swift中,有一个通用的模式可以用来解开可选项: 我目前正在执行这种模式匹配,但是在切换情况下使用元组,其中两个参数都是可选的: 但是,此打印: 有没有一种方法可以使我的选配和模式匹配不为零而展开?目前,我的解决方法是: 问题答案: 您可以使用以下模式: 只是的快捷方式,因此等效于