itjcms18
itjcms18

Reputation: 4333

replace specific number in a vector from a list in r

I've been working on this problem and can't seem to figure out the proper solution. Ultimately I'm going to use dplyr in order to group by and apply a function to a column. I turned the column into a vector. Here is a snippet:

vec1 <- append(append(append(rep(1,3),rep(2,6)), rep(3,5)),rep(4,2))

if the number repeats more than 3 times, I want to change the following number to 1. So in the vector above, the number 2 occurs 6 times and the number 3 occurs 5 times. That means I want to replace the number 3 and 4 with 1. Ultimately in this snippet, the answer I'm looking for is:

c(1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1)

What I have below worked for cases when only one number was repeated more than 3 times, but not multiple. In addition, if I'm doing this inefficiently I'd like to learn how to better script it.

stack <- table(vec1)
stack1 <- list(as.numeric(rownames(data.frame(stack[stack>3]))) + 1)
replace(vec1,vec1 == stack1,1)

thanks in advance for any help

Upvotes: 1

Views: 61

Answers (1)

akrun
akrun

Reputation: 887118

Try

inverse.rle(within.list(rle(vec1), 
      values[c(FALSE,(lengths >3)[-length(lengths)])] <- 1))
#[1] 1 1 1 2 2 2 2 2 2 1 1 1 1 1 1 1

Upvotes: 1

Related Questions