Вам не нужно использовать apply
здесь.Просто rowwise
, т.е.
library(dplyr)
df %>%
mutate_at(vars(4:5), funs(strsplit(., ','))) %>%
rowwise() %>%
mutate(new = toString(setdiff(StocCurrentQtr, StockNextQtr)))
, что дает,
Source: local data frame [6 x 6]
Groups: <by row>
# A tibble: 6 x 6
fundId Year Qtr StocCurrentQtr StockNextQtr new
<int> <int> <int> <list> <list> <chr>
1 1 2015 1 <chr [5]> <chr [4]> 1, 5
2 1 2015 2 <chr [4]> <chr [5]> 3, 51
3 1 2015 3 <chr [5]> <chr [1]> 7, 8, 9, 4, 2
4 2 2015 1 <chr [3]> <chr [3]> 10, 11
5 2 2015 2 <chr [3]> <chr [3]> 14, 16, 19
6 2 2015 3 <chr [3]> <chr [1]> 20, 21, 45
Эквивалент в базе R,
mapply(function(x, y)toString(setdiff(x, y)), strsplit(df$StocCurrentQtr, ','),
strsplit(df$StockNextQtr, ','))
#[1] "1, 5" "3, 51" "7, 8, 9, 4, 2" "10, 11" "14, 16, 19" "20, 21, 45"
Если StockNextQtr
отсутствует, мы можем сначала создать его и продолжить так же, как и раньше, то есть
df %>%
group_by(fundId) %>%
mutate(StockNextQtr = lead(StocCurrentQtr)) %>%
mutate_at(vars(4:5), funs(strsplit(., ','))) %>%
rowwise() %>%
mutate(new = toString(setdiff(StocCurrentQtr, StockNextQtr)))