首页 > 解决方案 > R对字符串中的数字求和

问题描述

我有个问题:

我有一个像这个简单示例这样的数据集:

df<-data.frame(ID=c("A","B","C","D"),
               Score=c("15","16/18/19+2/6","3/+2","19/18/14"))

我想得到一个拆分score数字的数据集。我的零件有问题/+2。当它说它"3/+2"实际上意味着:"3/3+2"最终会给出"3/5". 所以我需要一些帮助,最终得到一个这样的数据集:

  ID         Score
  A            15
  B 16/18/19/21/6
  C           3/5
  D      19/18/14

我已经发现我可以将分数分开

df<-df %>% 
  mutate(Score = strsplit(as.character(ID), "/")) %>%
  unnest(Score)

但我不知道如何让数字重复然后在 /+ 发生时求和,有人可以帮我吗?

标签: rstringsum

解决方案


它可能会以更优雅的方式解决,但这里有一种可能性:

df %>%
 mutate(Score = strsplit(as.character(Score), "/")) %>%
 unnest() %>%
 rowwise() %>%
 mutate(Score = eval(parse(text = paste0(Score)))) %>%
 group_by(ID) %>%
 mutate(Score = paste0(Score, collapse = "/")) %>%
 distinct()

  ID    Score     
  <fct> <chr>     
1 A     15        
2 B     16/18/21/6
3 C     3/5       
4 D     19/18/14  

样本数据:

df <- data.frame(ID=c("A","B","C","D"),
               Score=c("15","16/18/19+2/6","3/3+2","19/18/14"))

它基于 / 拆分“分数”,将字符转换为表达式parse(),然后将其转换回来。

使用您提供的数据和来自@A 的模式。苏里曼:

df %>%
 mutate(Score = strsplit(gsub("(\\d+)/*\\+(\\d+)","\\1/\\1+\\2", Score), "/")) %>%
 unnest() %>%
 rowwise() %>%
 mutate(Score = eval(parse(text = paste0(Score)))) %>%
 group_by(ID) %>%
 mutate(Score = paste0(Score, collapse = "/")) %>%
 distinct()

  ID    Score        
  <fct> <chr>        
1 A     15           
2 B     16/18/19/21/6
3 C     3/5          
4 D     19/18/14 

推荐阅读