Вычитание столбцов со строками - PullRequest
1 голос
/ 11 мая 2019

Я хотел бы создать 3-й столбец, который создает сумму разности компонентов в первых двух столбцах.

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.

Ответы [ 3 ]

0 голосов
/ 11 мая 2019

Ниже будет использоваться tidyverse, map от purr, str_split от stringr:

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 голосов
/ 11 мая 2019

Функция сканирования может считывать отдельные значения, как если бы они были небольшими CSV-файлами, тогда результаты можно обрабатывать с помощью diff и colSums

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 голосов
/ 11 мая 2019

Попробуйте:

# 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...