Набор функций индексации данных и представляющая интерес переменная - PullRequest
0 голосов
/ 22 января 2020

Я только начал изучать программирование, и у меня есть вопрос, который, вероятно, прост для вас. У меня есть набор данных, который выглядит примерно так:

df <- data.frame(id= c(1,1,1,2,2,2,3,3,3), time=c(1,2,3,1,2,3,1,2,3),y = rnorm(9), x1 = LETTERS[seq( from = 1, to = 9 )], x2 = c(0,0,0,0,1,0,1,1,1),c2 = rnorm(9))
df
#    id time     y      x1 x2     c2
# 1  1    1  0.6364831  A  0 -0.066480473
# 2  1    2  0.4476390  B  0  0.161372575
# 3  1    3  1.5113458  C  0  0.343956178
# 4  2    1  0.3532957  D  0  0.279987147
# 5  2    2  0.3401402  E  1 -0.462635393
# 6  2    3 -0.3160222  F  0  0.338454940
# 7  3    1 -1.3797158  G  1 -0.621169576
# 8  3    2  1.4026640  H  1 -0.005690801
# 9  3    3  0.2958363  I  1 -0.176488132

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

Однако, функция перестает работать, когда я пытаюсь dcast, так как она не может выделить переменную. Важный шаг функции выглядит примерно так:

testfun<-function(df,var)
{
newdf <- dcast(dataset,id+time~ x1, value.var = var) %>%  # note this should be the variable of interest that i feed into the function 
distinct()
return(newdf)
}
df2<-testfun(df,y)

Может кто-нибудь помочь мне и объяснить, как я могу создать функцию, в которой я индексирую как набор данных, так и функцию?

Спасибо заранее за вашу помощь

1 Ответ

3 голосов
/ 22 января 2020

Если вы передадите имя столбца как строку, функция будет работать как есть

library(tidyverse)
library(data.table)

testfun1<-function(df,var) {    
  newdf <- dcast(df,id+time~ x1, value.var = var) %>% distinct()
  return(newdf)
}

testfun1(df, "y")

Однако, если вы хотите передать переменную без кавычек в качестве ввода, вы можете использовать

testfun2<-function(df,var) {
  var1 <- deparse(substitute(var))
  newdf <- dcast(df,id+time~ x1, value.var = var1) %>% distinct()
  return(newdf)
}

testfun2(df, y)

Эквивалентная tidyr функция, упомянутая @Konrad Rudolph, - pivot_wider, которая будет работать с обоими типами входов.

testfun3 <-function(df,var) {
    new_df <- pivot_wider(df, names_from = x1, values_from = y)
    return(new_df)
}
testfun3(df, y)
testfun3(df, "y")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...