Найти последнее вхождение уникальных значений в столбце и изменить значение в R - PullRequest
1 голос
/ 22 марта 2019

У меня есть фрейм данных, как показано ниже

a  b
5  0
5  0
5  0
6  0
6  0

Мне требуется отредактировать столбец b и изменить его на единицу в последнем экземпляре каждого уникального значения a.Пример ожидаемого результата:

a  b
5  0
5  0
5  1
6  0
6  1

Я ищу более эффективное решение, чем использование apply() для извлечения номера строки, а затем переходим фрейм данных, чтобы изменить значение, так как мой фрейм данных имеет большой размер.

Ответы [ 3 ]

2 голосов
/ 22 марта 2019

Несколько способов сделать это

library(dplyr)

df %>%
  group_by(a) %>%
  mutate(b = if_else(row_number() == n(), 1L ,b))

#     a     b
#  <int> <dbl>
#1     5     0
#2     5     0
#3     5     1
#4     6     0
#5     6     1

То же, используя ave

with(df, ave(b, a, FUN = function(x) ifelse(seq_along(x) == length(x), 1, x)))

EDIT

В случае, если у вас есть столбцы в виде символов, нам нужно сначала преобразовать их в числовые и использовать if_else

df %>%
  mutate_all(as.numeric) %>%
  group_by(a) %>%
  mutate(b = if_else(row_number() == n(), 1 ,b))

ИЛИ просто используйте ifelse, так как это не зависит от строгой проверки типов

df %>%
  group_by(a) %>%
  mutate(b = ifelse(row_number() == n(), 1 ,b))
2 голосов
/ 22 марта 2019

Используйте duplicated и установите fromLast равным TRUE, чтобы вы начали смотреть с конца a.

with(df1, replace(b, !duplicated(a, fromLast = TRUE), 1))
#[1] 0 0 1 0 1
1 голос
/ 22 марта 2019

Вы можете выполнить соединение в последней строке:

library(data.table)
setDT(DT)

DT[.(unique(a)), on=.(a), mult="last", b := 1]

   a b
1: 5 0
2: 5 0
3: 5 1
4: 6 0
5: 6 1

Синтаксис x[i, on=, j].

  • Он просматривает каждую строку i в x, используя условия соединения on=.
  • Когда есть несколько совпадений для строки i, она занимает последнее.
  • В j мы обновляем b в x в соответствующих строках.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...