根据另一列中的不相同值添加一列

时间:2019-06-28 02:21:58

标签: r

我正在尝试添加一列数据,其中值归属于具有相同ID且另一个ID不相同的另一行。数据如下。

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 个答案:

答案 0 :(得分:6)

我可能正在使它复杂化,但是如果总是只有两个孩子,则逐个求和,然后删除分数

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

答案 1 :(得分:2)

一种选择是使用leadlag,并保留非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)))

答案 2 :(得分:1)

使用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中随机选择一个值。