折叠 R 中包含数字和字符变量的数据框

collapse a dataframe in R that contains both numeric and character variables

我有以下 data.frame:

data <- data.frame("ag" = rep(LETTERS[1:4],6), 
                   "date" = c(sapply(1:3, function(x) rep(x, 8))), 
                   "num_var1"= 1:24, 
                   "num_var2"= 24:1, 
                   "alpha_var1" = LETTERS[1:24], 
                   "alpha_var2" = LETTERS[25:2] )

我想使用 dplyr 通过 agdate 总结 (mean) 它的行。问题是有些行包含字符:在这种情况下,我想按组获取第一个条目(示例数据集已经排序)。

由于我的数据集有多个条目,我希望代码能够识别变量是数字(包括整数)还是字符。但是,到目前为止,我拥有的最佳解决方案是以下一个:

data %>%
 dplyr::group_by(ag, date) %>%
 summarise(across(everything(), mean))

为非数字变量创建 NAs。你有更好的解决方案吗?

这是您要找的吗?

library(dplyr)

data %>%
  dplyr::group_by(ag, date) %>%
  summarise(across(everything(), ~
                     if(is.numeric(.x)) mean(.x) else first(.x)))

#> `summarise()` has grouped output by 'ag'. You can override using the `.groups` argument.
#> # A tibble: 12 x 6
#> # Groups:   ag [4]
#>    ag     date num_var1 num_var2 alpha_var1 alpha_var2
#>    <chr> <int>    <dbl>    <dbl> <chr>      <chr>     
#>  1 A         1        3       22 A          Y         
#>  2 A         2       11       14 I          Q         
#>  3 A         3       19        6 Q          I         
#>  4 B         1        4       21 B          X         
#>  5 B         2       12       13 J          P         
#>  6 B         3       20        5 R          H         
#>  7 C         1        5       20 C          W         
#>  8 C         2       13       12 K          O         
#>  9 C         3       21        4 S          G         
#> 10 D         1        6       19 D          V         
#> 11 D         2       14       11 L          N         
#> 12 D         3       22        3 T          F

reprex package (v2.0.1)

于 2022-03-03 创建

另一个可能的解决方案:

library(tidyverse)

data %>%
  group_by(ag, date) %>%
  summarise(across(where(is.numeric), mean), 
    across(where(is.character), first), .groups = "drop")

#> # A tibble: 12 × 6
#>    ag     date num_var1 num_var2 alpha_var1 alpha_var2
#>    <chr> <int>    <dbl>    <dbl> <chr>      <chr>     
#>  1 A         1        3       22 A          Y         
#>  2 A         2       11       14 I          Q         
#>  3 A         3       19        6 Q          I         
#>  4 B         1        4       21 B          X         
#>  5 B         2       12       13 J          P         
#>  6 B         3       20        5 R          H         
#>  7 C         1        5       20 C          W         
#>  8 C         2       13       12 K          O         
#>  9 C         3       21        4 S          G         
#> 10 D         1        6       19 D          V         
#> 11 D         2       14       11 L          N         
#> 12 D         3       22        3 T          F