我正在尝试添加一列数据,其中值归属于具有相同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
答案 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)
一种选择是使用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)))
答案 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
中随机选择一个值。