我可以在没有`apply()`函数的情况下跨行应用R标准差吗?

时间:2019-04-25 17:06:20

标签: r purrr

library(tidyverse)
df <- tibble(col1 = c(5, 2), col2 = c(6, 4), col3 = c(9, 9))
# # A tibble: 2 x 3
#    col1  col2  col3
#   <dbl> <dbl> <dbl>
# 1     5     6     9
# 2     2     4     9

df %>% mutate(col4 = apply(.[, c(1, 3)], 1, sum))
df %>% mutate(col4 = rowSums(.[c(1, 3)], na.rm = TRUE))

最近,R的apply()函数对我来说很麻烦。目前,我将最小化它的使用并使用替代方法。 @akrun告诉我可以使用rowSums()代替上面所示的apply()

但是,有一种方法可以像我下面所做的那样在各列之间应用标准偏差。显然我的imaginary::rowSd函数无法正常工作。它是组成的。

df %>% mutate(col4 = apply(.[, c(1, 3)], 1, sd))
df %>% mutate(col4 = imaginary::rowSd(.[c(1, 3)], na.rm = TRUE))

不使用apply()的方法是什么?尽管我对该程序包和map()函数一无所知,但我在想purrr。也许有一个更简单/优雅的解决方案。


[编辑]我应该提到我不能使用列名称,因为名称经常在我从中提取信息的数据库中更改。我只能使用列号,因为从我提取数据的数据库中相对列的位置不会改变。

1 个答案:

答案 0 :(得分:1)

一个更简单的选项是rowSds中的matrixStats,但是它仅适用于matrix,因此将数据集的子集转换为matrix并应用rowSds

library(matrixStats)
library(dplyr)
df %>%
    mutate(col4 = rowSds(as.matrix(.[c(1, 3)]))) 
# A tibble: 2 x 4
#   col1  col2  col3  col4
#  <dbl> <dbl> <dbl> <dbl>
#1     5     6     9  2.83
#2     2     4     9  4.95