добавить столбец в зависимости от значения в другом столбце - PullRequest
4 голосов
/ 28 июня 2019

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

class_id  student  score  other_score
1         23       87     93
1         27       93     87
2         14       77     90
2         19       90     77

Столбец other_score - это то, чего я хочу достичь, учитывая первые три кулона. Я уже пробовал:
df$other_score = df[df$class_id == df$class_id & df$student != df$student,]$score

Ответы [ 3 ]

6 голосов
/ 28 июня 2019

Возможно, я усложняю, но если всегда есть только двое детей, сумма за группой к тому времени снимает балл

library(dplyr)
output = df %>%
  group_by(class_id) %>%
  mutate(other_score = sum(score)-score)

output
# A tibble: 4 x 4
# Groups:   class_id [2]
  class_id student score other_score
     <dbl>   <dbl> <dbl>       <dbl>
1        1      23    87          93
2        1      27    93          87
3        2      14    77          90
4        2      19    90          77

2 голосов
/ 28 июня 2019

Одним из вариантов будет использование lead и lag и сохранение значения, отличного от NA, каким бы оно ни было:

library(dplyr)
output <- df %>%
    group_by(class_id) %>%
    mutate(other_score <- ifelse(is.na(lead(score, order_by=student)),
                                 lag(score, order_by=student),           
                                 lead(score, order_by=student)))
1 голос
/ 28 июня 2019

Один из вариантов использования setdiff - игнорировать текущий индекс (row_number()) и выбрать score из оставшегося индекса.

library(dplyr)
library(purrr)

df %>%
  group_by(class_id) %>%
  mutate(other = score[map_dbl(seq_len(n()), ~setdiff(seq_len(n()), .))])

#  class_id student score other_score
#     <int>   <int> <int>       <int>
#1        1      23    87          93
#2        1      27    93          87
#3        2      14    77          90
#4        2      19    90          77

Если у вас более двух значений в каждом class_id, используйте

setdiff(seq_len(n()), .)[1])])

, который выберет только одно значение или вы также можете сделать

sample(setdiff(seq_len(n()), .))[1])])

для случайного выбора одного значения из оставшихся score.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...