R / tidyverse:计算各行的标准偏差

Dun*_*ois 5 statistics r dplyr

说我有以下数据:

colA <- c("SampA", "SampB", "SampC")
colB <- c(21, 20, 30)
colC <- c(15, 14, 12)
colD <- c(10, 22, 18)
df <- data.frame(colA, colB, colC, colD)
df
#    colA colB colC colD
# 1 SampA   21   15   10
# 2 SampB   20   14   22
# 3 SampC   30   12   18
Run Code Online (Sandbox Code Playgroud)

我想获取列BD中值的行均值和标准差。

我可以按以下方式计算rowMeans:

library(dplyr)
df %>% select(., matches("colB|colC|colD")) %>% mutate(rmeans = rowMeans(.))
#   colB colC colD   rmeans
# 1   21   15   10 15.33333
# 2   20   14   22 18.66667
# 3   30   12   18 20.00000
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用来计算标准偏差时sd(),会引发错误。

df %>% select(., matches("colB|colC|colD")) %>% mutate(rsds = sapply(., sd(.)))
Error in is.data.frame(x) : 
  (list) object cannot be coerced to type 'double'
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何在此处计算标准偏差?

编辑:我试图sapply()sd()看了第一个答案在这里

附加编辑:不一定要寻找“整洁”的解决方案(基数R也很好用)。

D. *_*ods 6

我不确定 old/newdplyrc_across功能与此页面上的先前答案有何关系,但这里有一个几乎直接从文档中剪切和粘贴的解决方案dplyr::c_across

df %>% 
  rowwise() %>% 
  mutate(
     mean = mean(c_across(colB:colD)),
     sd = sd(c_across(colB:colD))
  )

# A tibble: 3 x 6
# Rowwise: 
  colA   colB  colC  colD  mean    sd
  <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
1 SampA    21    15    10  15.3  5.51
2 SampB    20    14    22  18.7  4.16
3 SampC    30    12    18  20    9.17
Run Code Online (Sandbox Code Playgroud)


Hec*_*den 5

尝试这个(使用),rowSdsmatrixStats包中,

library(dplyr)
library(matrixStats)

columns <- c('colB', 'colC', 'colD')

df %>% 
  mutate(Mean= rowMeans(.[columns]), stdev=rowSds(as.matrix(.[columns])))
Run Code Online (Sandbox Code Playgroud)

退货

   colA colB colC colD     Mean    stdev
1 SampA   21   15   10 15.33333 5.507571
2 SampB   20   14   22 18.66667 4.163332
3 SampC   30   12   18 20.00000 9.165151
Run Code Online (Sandbox Code Playgroud)

您的数据

colA <- c("SampA", "SampB", "SampC")
colB <- c(21, 20, 30)
colC <- c(15, 14, 12)
colD <- c(10, 22, 18)
df <- data.frame(colA, colB, colC, colD)
df
Run Code Online (Sandbox Code Playgroud)