【问题标题】:Get mean of numbers in character string before and after comma获取逗号前后字符串中数字的平均值
【发布时间】:2021-01-31 06:49:31
【问题描述】:

我有一个带有字符列的数据框 (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)。

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

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

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

【问题讨论】:

    标签: r dplyr tidyverse average mean


    【解决方案1】:

    使用dplyr 可以这样实现:

    1. 使用逗号值beforeafter 创建新列
    2. 使用rowwise()c_across() 计算这些列的均值
    3. 去掉辅助列
    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
    

    【讨论】:

    • 嗯,我收到一个错误:``` mutate() 输入 ..1 有问题。 x 胶水不能将函数插入字符串。 * 对象 '.col' 是一个函数。 ``` 在另一个线程中,有人建议我删除“。”在 col 之前(使其变为“{col}_{.fn}”)。但后来我 ge ``` Error: unexpected ',' in " before = ~ as.numeric(stringr::str_extract(., "^\\d+"))," > Error: unexpected ')' in " after = ~ as.numeric(stringr::str_extract(., "\\d+$")))" > UseMethod("rowwise") 中的错误:``` 你能弄清楚这是什么意思吗?
    • 嗨,斯卡鲁普。很难说。刚刚再次检查了我的代码。使用 dplyr 1.0.2 和胶水 1.4.3 和 R 4.0.2 在我的机器上工作正常。也使用{col} 工作正常。此外,我在谷歌上进行了快速搜索,但除了使用col 解决问题的 SO 帖子外,我没有找到关于具体错误的参考。
    • 你好。通过也移动“。”在“.fn”之前问题已解决!非常感谢你帮我解决这个问题:)
    • 其实我还有一个问题。知道为什么 str_extract 将负数转换为 NA 吗? :)
    • 噢。对不起。总是负数。使用before = ~ as.numeric(stringr::str_extract(., "^-?\\d+"))-? 将考虑一个可选的减号。
    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2015-02-02
    • 2015-12-26
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多