[英]Mutate a value across several columns using dplyr selectors only
我想在不離開dplyr管道的情況下為數據框內的幾列計算sd。 在過去,我默認情況下以r為基數。 我一直無法在這里找到有效的解決方案。
這可能有助於提供一些上下文。 這是我驗證調查數據的過程。 我們測量矩陣問題的標准差,以識別直線。 跨列的sd為零表示一條直線。 過去,我在基數R中對此進行了如下計算:
apply(x, 1, sd)
我知道必須在dplyr管道中執行此操作。 我在mutate_at嘗試了多個選項,包括pmap和各種方法。 這是我最近的嘗試:
library(tidyverse)
set.seed(858465)
scale_points <- c(1:5)
q1 <- sample(scale_points, replace = TRUE, size = 100)
q2 <- sample(scale_points, replace = TRUE, size = 100)
q3 <- sample(scale_points, replace = TRUE, size = 100)
digits = 0:9
createRandString<- function() {
v = c(sample(LETTERS, 5, replace = TRUE),
sample(digits, 4, replace = TRUE),
sample(LETTERS, 1, replace = TRUE))
return(paste0(v,collapse = ""))
}
s_data <- tibble::tibble(resp_id = 100)
for(i in c(1:100)) {
s_data[i,1] <- createRandString()
}
s_data <- bind_cols(s_data, q1 = q1, q2 = q2, q3 = q3)
s_data %>% mutate(vars(starts_with("q"), ~sd(.)))
在理想情況下,我會將resp_id變量保留在輸出中,以便可以使用過濾器生成報告來標識sd == 0的響應者ID。
任何幫助是極大的贊賞!
如果我們需要逐行sd,
library(tidyverse)
s_data %>%
mutate(sdQs = select(., starts_with("q")) %>%
pmap_dbl(~ sd(c(...)))) %>%
filter(sdQs == 0)
# A tibble: 9 x 5
# resp_id q1 q2 q3 sdQs
# <chr> <int> <int> <int> <dbl>
#1 JORTY8990R 3 3 3 0
#2 TFYAF4729I 5 5 5 0
#3 VPUYC0789H 4 4 4 0
#4 LHAPM6293X 1 1 1 0
#5 FZQRQ8530P 3 3 3 0
#6 TKTJU3757T 5 5 5 0
#7 AYVHO1309H 4 4 4 0
#8 BBPTZ4822E 5 5 5 0
#9 NGLXT1705B 3 3 3 0
或者另一種選擇是rowSds
從matrixStats
library(matrixStats)
s_data %>%
mutate(sdQs = rowSds(as.matrix(.[startsWith(names(.), "q")])))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.