Как мне использовать аранжировку внутри функции? - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь создать пользовательскую функцию, которая выполняет некоторые преобразования данных.

Макет данных:

library(tidyverse)

set.seed(1)
sampledata_a <- data.frame(
  patientid = sample(1:100),
  servicetype = sample(c("service1", "service2", "service3", "service4", "service5"), 100, replace=TRUE),
  date = sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 100)
)
sampledata_b <- data.frame(
  patientid = sample(1:100),
  servicetype = sample(c("service6", "service7", "service8", "service9", "service10"), 100, replace=TRUE),
  date = sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 100)
)
sampledata1 <- rbind(sampledata_a, sampledata_b)

Пользовательская функция:

get_most_recent_and_unique <- function(inputdata, groupbyvar, uniquevar, datevar) {
  # first selects the most recent observation for each unique variable combination
  outputdata <- inputdata %>% 
    distinct() %>% 
    arrange(groupbyvar, uniquevar, desc(datevar)) %>% 
    mutate(orderkey = paste0(groupbyvar, uniquevar, sep = "")) %>% 
    group_by(orderkey) %>% 
    do(head(., n=1)) %>% 
    ungroup() %>% 
    arrange(groupbyvar, desc(datevar), uniquevar)

  # then tranpose from long to wide, and unite variables other than first variable into one  
  outputdata <- outputdata %>% 
    select(groupbyvar, uniquevar) %>% 
    group_by(groupbyvar) %>% 
    mutate(pos=1:n()) %>% 
    spread(pos, uniquevar) %>% 
    unite(uniquevar, -groupbyvar, sep=" / ")

  return(outputdata)
}

При запуске функции, как показано ниже:

outputdata <- get_most_recent_and_unique(sampledata1, "patientid", "servicetype", "date")

следующее сообщение об ошибке:

 Error in arrange_impl(.data, dots) : 
  incorrect size (1) at position 1, expecting : 100

Тем не менее, код отлично работает, когда находится за пределами определенной пользователем функции. Интересно, может кто-нибудь сказать мне, что не так?

testoutputdata <- sampledata1 %>% 
  distinct() %>% 
  arrange(patientid, servicetype, desc(date)) %>% 
  mutate(orderkey = paste0(patientid, servicetype, sep = "")) %>% 
  group_by(orderkey) %>% 
  do(head(., n=1)) %>% 
  ungroup() %>% 
  arrange(patientid, desc(date), servicetype)

testoutputdata <- testoutputdata %>% 
  select(patientid, servicetype) %>% 
  group_by(patientid) %>% 
  mutate(pos=1:n()) %>% 
  spread(pos, servicetype) %>% 
  unite(servicetype, -patientid, sep=" / ")

1 Ответ

0 голосов
/ 29 октября 2018

Попробуйте это:

get_most_recent_and_unique <- function(inputdata, groupbyvar, uniquevar, datevar) {

  groupbyvar <- enquo(groupbyvar)
  uniquevar <- enquo(uniquevar)
  datevar <- enquo(datevar)

  # first selects the most recent observation for each unique variable combination

  outputdata <- inputdata %>% 
    distinct() %>% 
    arrange(!! groupbyvar, !! uniquevar, desc(!! datevar)) %>% 
    mutate(orderkey := paste0(!! groupbyvar, !! uniquevar, sep = "")) %>% 
    group_by(orderkey) %>% 
    do(head(., n=1)) %>% 
    ungroup() %>% 
    arrange(!! groupbyvar, desc(!! datevar), !! uniquevar)

  # then tranpose from long to wide, and unite variables other than first variable into one  

  outputdata <- outputdata %>% 
    select(!! groupbyvar, !! uniquevar) %>% 
    group_by(!! groupbyvar) %>% 
    mutate(pos=1:n()) %>% 
    spread(pos, !! uniquevar) %>% 
    unite(!! uniquevar, -!! groupbyvar, sep=" / ")

  return(outputdata)
}

outputdata <- get_most_recent_and_unique(sampledata1, patientid, servicetype, date) # No quotation with arguments!

Вот вывод:

   patientid servicetype         
       <int> <chr>               
 1         1 service7 / service3 
 2         2 service10 / service1
 3         3 service4 / service9 
 4         4 service8 / service3 
 5         5 service6 / service1 

Похоже, они соответствуют вашим ожиданиям, когда я их сравниваю:

all.equal(outputdata, testoutputdata)
[1] TRUE

Обратите внимание, что вы не должны заключать аргументы в кавычки при указании функции , т.е. outputdata <- get_most_recent_and_unique(sampledata1, patientid, servicetype, date) будет работать, а outputdata <- get_most_recent_and_unique(sampledata1, "patientid", "servicetype", "date") не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...