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。也许有一个更简单/优雅的解决方案。
[编辑]我应该提到我不能使用列名称,因为名称经常在我从中提取信息的数据库中更改。我只能使用列号,因为从我提取数据的数据库中相对列的位置不会改变。
答案 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