Изменять значение в нескольких столбцах, используя только селекторы dplyr - PullRequest
1 голос
/ 17 мая 2019

Я хочу вычислить SD для нескольких столбцов внутри фрейма данных, не покидая моего канала dplyr.В прошлом я делал это по умолчанию на базе r.Я не смог найти решение, которое бы работало здесь.

Это может помочь предоставить некоторый контекст.Это процесс, который я делаю для проверки данных опроса.Мы измеряем sd матричных вопросов для выявления прямых линий.Нд через столбцы помечается прямой линией.В прошлом я рассчитывал это в базе R следующим образом:

apply(x, 1, sd)

Я знаю, что должен быть способ сделать это в трубе dplyr.Я пробовал несколько вариантов, включая pmap и различные подходы в mutate_at.Вот моя последняя попытка:

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.

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 17 мая 2019

Если нам нужен сдвоенный сд,

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")])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...