2017-02-20 13 views
1

У меня длинный вектор в R, в котором последовательная ценность часто повторяется. НапримерОт [0.2, 0.2, 0.2] до «R 0.2 3»

x = c(rep(0.2, 1500), rep(0.1, 10007), 0.7, 0.9, rep(0.1, 9784)) 

Я пытаюсь написать функцию, которая принимает этот вектор в качестве входных данных и возвращать либо из двух следующих строк

s = "R 0.2 1500 R 0.1 10007 R 0.7 1 R 0.9 1 R 0.1 9784" 

или преимущественно

s = "R 0.2 1500 R 0.1 10007 0.7 0.9 R 0.1 9784" 

, где R 0.7 1 R 0.9 1 стали 0.7 0.9.

Для вашей интуиции R означает repeat или rep. Поэтому строка тесно связана с тем, как я построил вектор x.

Я пробовал перебирать каждое значение, но это было слишком медленно для моих нужд. Можете ли вы помочь мне найти быстрое решение?

+4

Вы посмотрели на 'rle'? –

+0

'rle' - это действительно путь. Можно ответить на любой из 3 ответов, предложенных в комментариях. –

ответ

1
#Data 
x = c(rep(0.2, 1500), rep(0.1, 10007), 0.7, 0.9, rep(0.1, 9784)) 

#Run rle and paste values and lengths together 
y = paste("R", rle(x)$values, rle(x)$lengths) 

#There may be an easier way to do this using regex 
#But here is one solution using strsplit 
#Remove 1 and R 
y = sapply(strsplit(y," "), function(a) 
    if (gsub(" ","",a[3]) == "1"){ 
     a = a[2] 
    } else { 
    a = a 
    } 
) 

#Collapse everything together 
paste(unlist(y), collapse = " ") 
#[1] "R 0.2 1500 R 0.1 10007 0.7 0.9 R 0.1 9784"