首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过解析列来转换数据

通过解析列来转换数据
EN

Stack Overflow用户
提问于 2022-05-19 16:34:26
回答 4查看 46关注 0票数 0

上下文

我创建了一个小样本数据,以解释我的问题。原来的一个更大,因为它有更多的列。但是它的格式是相同的。

代码语言:javascript
运行
复制
df = data.frame(Case1.1.jpeg.text="the",
                Case1.1.jpeg.text.1="big",
                Case1.1.jpeg.text.2="DOG",
                Case1.1.jpeg.text.3="10197",
                
                Case1.2.png.text="framework",
                
                Case1.3.jpg.text="BE",
                Case1.3.jpg.text.1="THE",
                Case1.3.jpg.text.2="Change",
                Case1.3.jpg.text.3="YOUWANTTO",
                Case1.3.jpg.text.4="SEE",
                Case1.3.jpg.text.5="in",
                Case1.3.jpg.text.6="theWORLD",
                
                Case1.4.png.text="09.80.56.60.77")

该数据由基于一定数量输入图像的文本检测ML模型的输出组成。

输出格式使每个图像的每个单词成为单独的列,从而创建一个非常广泛的数据集。

期望输出

我希望创建一个更清晰的版本,其中一列包含图像名称(例如Case1.2.png),第二列将模型在特定图像中找到的所有可能的单词连在一起(每个图像的字数各不相同)。

代码语言:javascript
运行
复制
result = data.frame(Case=c('Case1.1.jpeg','Case1.2.png','Case1.3.jpg','Case1.4.png'),
                Text=c('thebigDOG10197','framework','BETHEChangeYOUWANTTOSEEintheWORLD','09.80.56.60.77'))

我尝试过许多基于Stackoverflow上类似问题的方法,但似乎没有一个能给出我想要的确切输出。

如果能在这方面提供任何帮助,我们将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-05-19 16:46:52

代码语言:javascript
运行
复制
library(tidyr)
library(dplyr)

df %>% 
  pivot_longer(cols = everything(),
               names_pattern = "(.*)\\.(text.*)",
               names_to = c("Case", NA)) %>% 
  group_by(Case) %>% 
  summarize(value = paste(value, collapse = ""), .groups = "drop")

或者,只使用tidyr的枢轴函数就可以完成这一任务。

代码语言:javascript
运行
复制
library(tidyr)
library(stringr)

df %>% 
  pivot_longer(cols = everything(),
               names_pattern = "(.*)\\.(text).*",
               names_to = c("Case", "cols")) %>% 
  pivot_wider(id_cols = Case,
              values_from = value,
              names_from = cols,
              values_fn = str_flatten)

输出

代码语言:javascript
运行
复制
  Case         value                            
  <chr>        <chr>                            
1 Case1.1.jpeg thebigDOG10197                   
2 Case1.2.png  framework                        
3 Case1.3.jpg  BETHEChangeYOUWANTTOSEEintheWORLD
4 Case1.4.png  09.80.56.60.77  
票数 1
EN

Stack Overflow用户

发布于 2022-05-19 16:44:11

一种可能的解决办法:

代码语言:javascript
运行
复制
library(tidyverse)

df %>% 
  pivot_longer(everything()) %>% 
  mutate(name = str_remove(name, "\\.text\\.*\\d*")) %>% 
  group_by(name) %>% 
  summarise(text = str_c(value, collapse = ""))

#> # A tibble: 4 x 2
#>   name         text                             
#>   <chr>        <chr>                            
#> 1 Case1.1.jpeg thebigDOG10197                   
#> 2 Case1.2.png  framework                        
#> 3 Case1.3.jpg  BETHEChangeYOUWANTTOSEEintheWORLD
#> 4 Case1.4.png  09.80.56.60.77
票数 1
EN

Stack Overflow用户

发布于 2022-05-19 16:44:12

base R中的一个选项是使用stack将数据分成两列data.frame,然后通过pasteaggregate进行分组。

代码语言:javascript
运行
复制
aggregate(cbind(Text = values) ~ Case, transform(stack(df), 
  Case = trimws(ind, whitespace = "\\.text.*")), FUN = paste, collapse = "")
          Case                              Text
1 Case1.1.jpeg                    thebigDOG10197
2  Case1.2.png                         framework
3  Case1.3.jpg BETHEChangeYOUWANTTOSEEintheWORLD
4  Case1.4.png                    09.80.56.60.77
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72308131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档