разница между двумя запятыми - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть следующий yy

    fundId  Year    Qtr   StockCurrentQtr    StockNextQtr
    1       2015    1     1,2,3,4,5         2,3,4,51
    1       2015    2     2,3,4,51          7,8,9,4,2
    1       2015    3     7,8,9,4,2         NA
    2       2015    1     10,11,14          14,16,19
    2       2015    2     14,16,19          20,21,45
    2       2015    3     20,21,45          NA

Я хочу узнать разницу между StockNextQtr и StocCurrentQtr для каждой строки group_by fundId илиразница между последовательными строками для столбца StockCurrentQtr group_by fundId

yy <- yy %>% 
       group_by(fundId) %>% 
       mutate(StockDiff = apply(yy,2,function(x){
                    paste(setdiff(unlist(strsplit(x[5], split = ",")), unlist(strsplit(x[4], 
                                                            split = ","))),collapse = ",")}))

Я получаю следующую ошибку:

Столбец StockDiff должен иметь длину 3 (группаразмер) или один, а не 5

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

я нашел другой способ

yy <- yy %>% group_by(fundId, Year, Qtr) %>% mutate(new = paste(setdiff((unlist(strsplit(StockCurrentQtr,split = ","))), unlist(strsplit(StockNextQtr,split = ","))),collapse = ","))
0 голосов
/ 24 декабря 2018

Вам не нужно использовать 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)))
...