R - изменить значение столбца в зависимости от первого появления другого столбца - PullRequest
0 голосов
/ 25 сентября 2018

Предположим, у меня есть файл, содержащий 2 столбца, похожих на этот:

     ID   Order
      2       1
     10       2
     70       3
     85       4
     70       5
    213       6
      2       7
    293       8
     10       9
    313      10
    ...     ...

с IDs, содержащий числа от 1 до 1000, каждый из которых появляется 4 раза.В Order есть числа от 1 до 4000.

Возможно ли в R изменить столбец Order таким образом, чтобы для следующих 3 одинаковых идентификаторов он заменял Order наOrder соответствует первому вхождению?Для примера набора данных он, например, выведет следующее:

     ID   Order
      2       1
     10       2
     70       3
     85       4
     70       3
    213       6
      2       1
    293       8
     10       2
    313      10
    ...     ...

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Вы можете легко сделать это, используя библиотеку dplyr.Вы можете сгруппировать по идентификатору, а затем использовать функцию mutate, чтобы найти минимальный заказ для каждого идентификатора.

library(dplyr)
df %>% 
  group_by(ID) %>% 
  mutate(Order = min(Order)) %>% 
  ungroup()

# A tibble: 10 x 2
      ID Order
   <int> <dbl>
 1     2     1
 2    10     2
 3    70     3
 4    85     4
 5    70     3
 6   213     6
 7     2     1
 8   293     8
 9    10     2
10   313    10
0 голосов
/ 25 сентября 2018

Другой вариант - отфильтровать первые вхождения, а затем вернуться к полному списку оригинальных идентификаторов.

library(dplyr)
library(readr)
library(purrr)

df <- read_table2(" ID   Order
      2       1
     10       2
     70       3
     85       4
     70       5
    213       6
      2       7
    293       8
     10       9
    313      10")

df %>% 
  filter(!duplicated(ID)) %>% 
  list(., df %>% select(ID)) %>%
  reduce(full_join, by = "ID")
#> # A tibble: 10 x 2
#>       ID Order
#>    <int> <int>
#>  1     2     1
#>  2     2     1
#>  3    10     2
#>  4    10     2
#>  5    70     3
#>  6    70     3
#>  7    85     4
#>  8   213     6
#>  9   293     8
#> 10   313    10

. Создан в 2018-09-25 пакетом Представления (v0.2.0).

0 голосов
/ 25 сентября 2018

База R:

df$Order <- with(df, ave(Order, ID, FUN = `[`, 1))

data.table:

library(data.table)
setDT(df)

df[, Order := Order[1], ID]


#      ID Order
#  1:   2     1
#  2:  10     2
#  3:  70     3
#  4:  85     4
#  5:  70     3
#  6: 213     6
#  7:   2     1
#  8: 293     8
#  9:  10     2
# 10: 313    10
...