基于R data.table中数字变量按组的max()的结转字符串值

基于R data.table中数字变量按组的max()的结转字符串值,r,group-by,data.table,character,R,Group By,Data.table,Character,是否有一个简短的代码将所需行的字符串值带入整个组 作为参考,对于数值变量,我可能希望根据另一个变量(x)的max()值,将组内数值变量(y)的值带入该组的所有观测值。我通过以下方式做到这一点: d <- data.table(id =c('A','A','A','A','B','B','B','B','B'), x =c(10, 1, 4, NA, NA, NA, NA, 9 , 23), y =c( 7, 6, 23,

是否有一个简短的代码将所需行的字符串值带入整个组

作为参考,对于数值变量,我可能希望根据另一个变量(x)的max()值,将组内数值变量(y)的值带入该组的所有观测值。我通过以下方式做到这一点:

d <- data.table(id  =c('A','A','A','A','B','B','B','B','B'),
                x =c(10, 1, 4,  NA, NA, NA, NA, 9 , 23),
                y =c( 7, 6, 23, 1 , 2, NA, NA, 9 , 4),
                char=c('W','X','Y','Z','T',NA, NA, NA, NA))

d[,aux:=(x==max(x,na.rm=T) & !is.na(x)),by=id]
d[,aux2:=y*aux,by=id]
d[,y_carry_max:=max(aux2,na.rm=T),by=id]
如何跨每个GROUP的其他行携带
char\u aux
的值以创建变量
char\u carry\u max

EDIT1:所需的输出是最后一列:

   id  x  y char   aux aux2 y_carry_max char_aux char_carry_max
1:  A 10  7    W  TRUE    7           7        W              W
2:  A  1  6    X FALSE    0           7       NA              W
3:  A  4 23    Y FALSE    0           7       NA              W
4:  A NA  1    Z FALSE    0           7       NA              W
5:  B NA  2    T FALSE    0           4       NA              P
6:  B NA NA   NA FALSE   NA           4       NA              P
7:  B NA NA   NA FALSE   NA           4       NA              P
8:  B  9  9   NA FALSE    0           4       NA              P
9:  B 23  4    P  TRUE    4           4        P              P
Edit2:关于@AdagioMolto注释:“x中的每个值是否对应于char中的唯一值?如果两行或更多行的特征为x==max(x)?应该使用哪个char?”

好问题。假设就本问题而言,它们是唯一的。实际上,我所做的是添加一个较小数量级的随机扰动来打破联系。在上面的例子中,它应该是:
d[,x:=x+(runif(.N)/1000)]

Edit3:除了下面漂亮的dplyr答案之外,还有一种更为自然的data.table方法吗?

使用dplyr(以及@Frank和@LucasMation的评论):


x
中的每个值是否对应于
char
中的唯一值?如果两行或更多行具有
x==max(x)
,该怎么办?应该使用哪一个字符?请发布预期输出,包括
char\u carry\u max
变量。注意,您可以使用
d[,y\u carry\u max2:=y[Which.max(x)],by=id]
不带中间变量求解第一部分steps@AdagioMolto请参见编辑1above@docendo迪西姆斯,请参见上面的edit1
:=
在mutate内部做了什么?@Smithgoestowashington先生,漂亮的答案(我会等待一个propper data.table的方式,然后再给出答案,但这看起来不错!)@Smithgoestowashington先生,我建议您在最后添加
%>%data.table()
,使其返回相同的对象类型(data.table),而不是一张桌子。我试图编辑自己,但编辑被拒绝
   id  x  y char   aux aux2 y_carry_max char_aux char_carry_max
1:  A 10  7    W  TRUE    7           7        W              W
2:  A  1  6    X FALSE    0           7       NA              W
3:  A  4 23    Y FALSE    0           7       NA              W
4:  A NA  1    Z FALSE    0           7       NA              W
5:  B NA  2    T FALSE    0           4       NA              P
6:  B NA NA   NA FALSE   NA           4       NA              P
7:  B NA NA   NA FALSE   NA           4       NA              P
8:  B  9  9   NA FALSE    0           4       NA              P
9:  B 23  4    P  TRUE    4           4        P              P
d %>% group_by(id) %>% 
mutate(char_carry_max = char[which.max(x)], y_carry_max = y[which.max(x)]) %>% 
data.table()