首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用字符串减去列

用字符串减去列
EN

Stack Overflow用户
提问于 2019-05-11 05:41:35
回答 3查看 40关注 0票数 0

我想创建一个第3列,它创建了前两列组件的差值的总和。

代码语言:javascript
复制
x <- data.frame("Start" = c("21,22","14,15","2,4,6,8,10"),
                "End" = c("31,32","19,20","12,14,16,18,20"))

行1列3应为(31-21)+(32-22) = 20

行2列3应为(19-14)+(20-15) = 10

第3行第3列应为(12-2)+(14-4)+(16-6)+(18-8)+(20-10)=50

EN

回答 3

Stack Overflow用户

发布于 2019-05-11 06:01:17

尝试:

代码语言:javascript
复制
# install.packages("tidyverse") # if needed
library(tidyverse)

final <- x %>% 
  mutate(startList = str_split(Start, ","),
         endList = str_split(End, ",")) %>% 
  unnest(startList, endList) %>% 
  mutate(subtraction = as.numeric(endList) - as.numeric(startList)) %>% 
  group_by(Start, End) %>% 
  mutate(calc = sum(subtraction)) %>% 
  slice(1) %>% 
  ungroup() %>% 
  select(Start, End, calc)
票数 0
EN

Stack Overflow用户

发布于 2019-05-11 06:06:56

下面将使用tidyverse,来自purrmap,来自stringrstr_split

代码语言:javascript
复制
get_sum = function(z){
  sum(as.numeric(z))
}

x %>% 
  mutate(col3 = unlist(map(str_split(End, ','), get_sum)) - unlist(map(str_split(Start, ','), get_sum)))

       Start            End col3
1      21,22          31,32   20
2      14,15          19,20   10
3 2,4,6,8,10 12,14,16,18,20   50
票数 0
EN

Stack Overflow用户

发布于 2019-05-11 06:07:02

扫描函数可以读取单个值,就像它们是小csv文件一样,然后可以使用diff和colSums处理结果

代码语言:javascript
复制
apply(x, 1, function(z){ diff( colSums( # the differences of the col sums
          sapply( z,   # sapply will return two column matrices
                function(y)  as.numeric( scan( text=y, sep=",", what="") 
                  )          )          )    )
                        })
Read 2 items
Read 2 items
Read 2 items
Read 2 items
Read 5 items
Read 5 items
[1] 20 10 50
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56085161

复制
相关文章

相似问题

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