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