Если n встречается менее 5 раз, измените на n-1 - PullRequest
0 голосов
/ 22 апреля 2020

В R, если у меня есть df чисел c (1,1,1,2,3,3,3,3,3,3,4,4,4,5,5), как изменить n на n-1, если n встречается менее 5 раз? Пример ввода x и вывода out.

    x out
1  1   1
2  1   1
3  1   1
4  2   1
5  3   3
6  3   3
7  3   3
8  3   3
9  3   3
10 3   3
11 4   3
12 4   3
13 4   3

В качестве первого значения в столбце (оно также будет минимальным), 1 останется прежним. Однако, если это облегчит кодирование, цифры 1 могут измениться на 0, а цифра 2 все равно изменится на 1.

РЕДАКТИРОВАТЬ : как я могу повторить это, если сейчас изменились значения происходят <5 раз? Например </p>

#      x out
# [1,] 1   0
# [2,] 1   0
# [3,] 1   0
# [4,] 2   1
# [5,] 3   3
# [6,] 3   3
# [7,] 3   3
# [8,] 3   3
# [9,] 3   3
#[10,] 3   3
#[11,] 4   3
#[12,] 4   3
#[13,] 4   3
#[14,] 5   3
#[15,] 5   3
#[16,] 5   3
#[17,] 6   3
#[18,] 6   3
#[19,] 6   3
#[20,] 7   3
#[21,] 7   3

Ответы [ 3 ]

2 голосов
/ 22 апреля 2020

Использование ave:

x <- c(1,1,1,2,3,3,3,3,3,3,4,4,4)
pmax(x - +(ave(x, x, FUN =length) < 5), 1)
#[1] 1 1 1 1 3 3 3 3 3 3 3 3 3

Если значения в x могут повторяться, нам нужно использовать rle для группировки.

pmax(x - +(ave(x,with(rle(x),rep(seq_along(values), lengths)),FUN =length) < 5),1)
1 голос
/ 22 апреля 2020

Вы можете использовать rle, если отсортировано по x, чтобы узнать, сколько раз число существует. И вычтите 1, если их меньше 5.

i <- order(x)
y <- rle(x[i])
y$values <- y$values - (y$lengths < 5)
cbind(x,out=inverse.rle(y)[order(i)])
#      x out
# [1,] 1   0
# [2,] 1   0
# [3,] 1   0
# [4,] 2   1
# [5,] 3   3
# [6,] 3   3
# [7,] 3   3
# [8,] 3   3
# [9,] 3   3
#[10,] 3   3
#[11,] 4   3
#[12,] 4   3
#[13,] 4   3
#[14,] 5   4
#[15,] 5   4
0 голосов
/ 22 апреля 2020

Другое решение

library(tidyvese)
x <- c(1,1,1,2,3,3,3,3,3,3,4,4,4,5,5)
df <- tibble(x = x)

df %>% 
  group_by(x) %>% 
  mutate(n = n()) %>% 
  ungroup %>% 
  transmute(x, 
            out = if_else((x != min(x, na.rm = T) & n < 5), x - 1, x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...