这个问题在这里已有答案:
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()
函数知之甚少,但我在想。也许有一个更简单/更优雅的解决方案。
[编辑]我应该提到我不能使用列名,因为名称经常在数据库中更改我从中提取信息。我只能使用列号,因为数据库中的相对列位置没有变化我从中提取数据。
一个更简单的选择是来自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