获取逗号前后字符串中数字的平均值
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
这可以像这样实现:
- 使用值
before
和 after
逗号 创建新的列
- 使用
rowwise()
和 c_across()
计算这些列的均值
- 去掉辅助列
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
我有一个包含字符列的数据框 (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
这可以像这样实现:
- 使用值
before
和after
逗号 创建新的列
- 使用
rowwise()
和c_across()
计算这些列的均值
- 去掉辅助列
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