获取逗号前后字符串中数字的平均值

Get mean of numbers in character string before and after comma

我有一个包含字符列的数据框 (df)。每个索引由一串数字组成,以逗号分隔。请参阅可重现的示例:

a<-c("1,2", "6,8", "6,9")
b<-c("4,7","9,3","5,5")
c<-c("2,1","5,4","8,9")
df <- as.data.frame(cbind(a,b,c))

我想分别计算逗号前和逗号后的数字的行均值。最好用 tidyverse/dplyr。输出将如下所示:

    a   b   c mean1 mean2
  1,2 4,7 2,1  2.33  3.33
  6,8 9,3 5,4  6.67  5.00
  6,9 5,5 8,9  6.00  7.67

所以mean1中的第一个索引是第一行逗号前数字的平均值((1+4+2)/3)。而 mean2 中的第一个索引是第一行逗号后数字的平均值 ((2+7+1)/3).

我看过另一个 post 建议使用 library(splitstackshape) 和 cSplit 命令,但我无法让它工作。

df <- df %>% cSplit(c("a","b","c"), direction = "wide") %>%
  summarise(mean = rowMeans(c("a","b","c")))

我也尝试过用逗号分隔列并将它们转换为宽和其他各种东西。如果能这样解决,那绝对是最简单的方法。如果你能想出一个不涉及列名的解决方案,那就太棒了!

利用 dplyr 这可以像这样实现:

  1. 使用值 beforeafter 逗号
  2. 创建新的列
  3. 使用 rowwise()c_across()
  4. 计算这些列的均值
  5. 去掉辅助列
a<-c("1,2", "6,8", "6,9")
b<-c("4,7","9,3","5,5")
c<-c("2,1","5,4","8,9")
df <- as.data.frame(cbind(a,b,c))

library(dplyr)

df %>%
  mutate(across(a:c, list(
    before = ~ as.numeric(stringr::str_extract(., "^\d+")),
    after = ~ as.numeric(stringr::str_extract(., "\d+$"))), .names = "{.col}_{.fn}")) %>% 
  rowwise() %>% 
  mutate(mean1 = mean(c_across(ends_with("before"))),
         mean2 = mean(c_across(ends_with("after")))) %>% 
  select(-ends_with("before"), -ends_with("after"))
#> # A tibble: 3 x 5
#> # Rowwise: 
#>   a     b     c     mean1 mean2
#>   <chr> <chr> <chr> <dbl> <dbl>
#> 1 1,2   4,7   2,1    2.33  3.33
#> 2 6,8   9,3   5,4    6.67  5   
#> 3 6,9   5,5   8,9    6.33  7.67