2016-07-21 4 views
0

У меня есть набор данных, такой как следующий, и для каждой строки я хочу сместить некоторые столбцы на основе условия.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  
+0

Пожалуйста, удалите все те, '' ** – akrun

+0

имена столбцов являются противоречивыми, и в цифрах и правописанием. – alistaire

ответ

0

Вот вариант, который не является очень чистым, но, ну, и не является формой ваших данных. Если оригинал 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 
Смежные вопросы