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

问题描述 投票:0回答:1
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()函数知之甚少,但我在想。也许有一个更简单/更优雅的解决方案。


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

r purrr
1个回答
1
投票

一个更简单的选择是来自rowSdsmatrixStats,但它仅适用于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
© www.soinside.com 2019 - 2024. All rights reserved.