R 对所选列使用组_modify(保留整个数据框和顺序)

R 对所选列使用组_modify(保留整个数据框和顺序),r,dplyr,R,Dplyr,我在这一台上用完了R电源。我非常感谢任何帮助,对于经验丰富的人来说,这可能很简单 我有一个数据框(TIBLE),其中包含一些数字列、一个组列和一些包含其他信息的列。我想按组对数字列执行操作,但仍保留所有列 我在下面举了一个例子:对于每一列,我用组平均值替换NAs。替换NAs的列由df_names变量指定 它基本上是有效的,只是它删除了除数值列以外的所有列,并对所有列重新排序。这使得它很难重新组装。我可以解决这个问题,但我觉得必须有一种更简单的方法来指导group_应用于指定的列,同时保留其他列并

我在这一台上用完了R电源。我非常感谢任何帮助,对于经验丰富的人来说,这可能很简单

我有一个数据框(TIBLE),其中包含一些数字列、一个组列和一些包含其他信息的列。我想按组对数字列执行操作,但仍保留所有列

我在下面举了一个例子:对于每一列,我用组平均值替换NAs。替换NAs的列由df_names变量指定

它基本上是有效的,只是它删除了除数值列以外的所有列,并对所有列重新排序。这使得它很难重新组装。我可以解决这个问题,但我觉得必须有一种更简单的方法来指导group_应用于指定的列,同时保留其他列并保持顺序

有人能帮忙吗?非常感谢

意志

库(“tidyverse”)
#创建可编辑的

在这种情况下,df
组的修改是过度的
mutate(cross())
这里是您的朋友:

df%>%分组依据(.dots=groupvar)%>%
变异(跨越(所有的(df_名称),~if_-else(is.na(.x),mean(.x,na.rm=TRUE),.x)))
结果:

> df
# A tibble: 10 x 5
# Groups:   csize [2]
   name  csize     v1      v2      v3
   <chr> <chr>  <dbl>   <dbl>   <dbl>
 1 a     L     -1.22   1.48   -0.628 
 2 b     S     -1.17   0.0890 -0.130 
 3 c     S     -0.422 -0.0956 -0.0271
 4 d     L     -0.265  0.180  -0.786 
 5 e     L     -0.491  0.509  -0.359 
 6 f     S     -0.422 -0.712   0.232 
 7 g     L     -0.400 -1.13    1.13  
 8 h     S     -0.538 -0.0785  0.690 
 9 i     L      0.373  0.308   0.252 
10 j     S      0.445  0.743  -1.41 
>df
#一个tibble:10x5
#组别:csize[2]
名称csize v1 v2 v3
1 a L-1.22 1.48-0.628
2 b S-1.17 0.0890-0.130
3 CS-0.422-0.0956-0.0271
4 d L-0.265 0.180-0.786
5 e L-0.491 0.509-0.359
6 f S-0.422-0.712 0.232
7 g L-0.400-1.13 1.13
8小时-0.538-0.0785 0.690
9 i L 0.373 0.308 0.252
10 j S 0.445 0.743-1.41
这是否有效:

> library(dplyr)
> df %>% group_by(csize) %>% mutate(across(v1:v3, ~ replace_na(., mean(., na.rm = T))))
# A tibble: 10 x 5
# Groups:   csize [2]
   name  csize     v1      v2     v3
   <chr> <chr>  <dbl>   <dbl>  <dbl>
 1 a     L      1.57   0.310  -1.76 
 2 b     S     -0.705  0.0655  0.577
 3 c     S     -1.05   1.28    1.82 
 4 d     L      0.958 -2.09   -0.371
 5 e     L     -0.712  0.247  -1.13 
 6 f     S     -1.05  -0.516  -0.107
 7 g     L      0.403  1.79    0.128
 8 h     S     -0.793  1.52    1.07 
 9 i     L     -0.206 -0.369  -1.77 
10 j     S     -1.65  -0.992  -0.476
>库(dplyr)
>df%>%组由(csize)%>%突变(跨(v1:v3,~replace_na(,平均值(,na.rm=T)))
#一个tibble:10x5
#组别:csize[2]
名称csize v1 v2 v3
1 a L 1.57 0.310-1.76
2BS-0.7050.0655 0.577
3 CS-1.05 1.28 1.82
4 d L 0.958-2.09-0.371
5 e L-0.712 0.247-1.13
6 f S-1.05-0.516-0.107
7克升0.403 1.79 0.128
8小时-0.7931.52 1.07
9升-0.206-0.369-1.77
10 j S-1.65-0.992-0.476

是的,这正是我想要的!非常感谢你的帮助。
> library(dplyr)
> df %>% group_by(csize) %>% mutate(across(v1:v3, ~ replace_na(., mean(., na.rm = T))))
# A tibble: 10 x 5
# Groups:   csize [2]
   name  csize     v1      v2     v3
   <chr> <chr>  <dbl>   <dbl>  <dbl>
 1 a     L      1.57   0.310  -1.76 
 2 b     S     -0.705  0.0655  0.577
 3 c     S     -1.05   1.28    1.82 
 4 d     L      0.958 -2.09   -0.371
 5 e     L     -0.712  0.247  -1.13 
 6 f     S     -1.05  -0.516  -0.107
 7 g     L      0.403  1.79    0.128
 8 h     S     -0.793  1.52    1.07 
 9 i     L     -0.206 -0.369  -1.77 
10 j     S     -1.65  -0.992  -0.476