R: как сдвигать столбцы в зависимости от условий

У меня есть набор данных, подобный следующему, и для каждой строки я хочу сместить некоторые столбцы в зависимости от условия.

  flv1 attr1_1 attr2_1 flv2 atrr2_1 atrr2_2 flv3 atrr3_1 atrr3_2
  1    3       4       3    4       2       2    2       5
  2    3       4       3    4       2       1    5       5
  1    3       4       3    4       2       2    4       5

и результат, которого я хочу достичь, состоит в том, что, когда число под flvi не i. Я переместу соответствующие значения вдоль значений в двух последующих столбцах в i-й столбец. В частности, результат, который я хочу достичь, выглядит следующим образом:

flv1 attr1_1 attr2_1 flv2 atrr2_1 atrr2_2 flv3 atrr3_1 atrr3_2
  1    3       4       2    2       5          3    4       2
  1    5       5       2    3       4          3    4       2       
  1    3       4       2    4       5          3    4       2       

1 ответ

Решение

Вот вариант, который не очень чистый, но, ну, в общем, это не форма ваших данных. Если оригинальный data.frame называется df:

library(dplyr)

       # clean out asterisks
df %>% mutate_all(tidyr::extract_numeric) %>% 
    # apply a function to split each row into three groups, order by the flvis, and recombine
    apply(1, function(x){split(x, rep(1:3, each = 3))[order(x[c(1,4,7)])] %>% unlist()}) %>% 
    # clean up matrix back to original data.frame form
    t() %>% as.data.frame() %>% setNames(names(df))

##   flv1 attr1_1 attr2_1 flv2 atrr2_1 atrr2_2 flv3 atrr3_1 atrr3_2
## 1    1       3       4    2       2       5    3       4       2
## 2    1       5       5    2       3       4    3       4       2
## 3    1       3       4    2       4       5    3       4       2
Другие вопросы по тегам