Фильтрация данных и именования на основе переменной в функции в R - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь написать функцию, которая позволяет мне (A) создать data.frame, который назван в честь аргументов в функции.(B) Этот data.frame должен быть подмножеством большего data.frame (здесь df).Наконец, мне нужно иметь возможность сохранить объект / data.frame из функции как печатный (и т. Д.) data.frame.

Примером является ...

Group <- c("Primary Group","Primary Group","Primary Group","Primary Group","Primary Group","Primary Group","Secondary Group","Secondary Group","Secondary Group","Secondary Group","Secondary Group","Secondary Group","Tertiary Group","Tertiary Group","Tertiary Group","Tertiary Group","Tertiary Group","Tertiary Group")
Day <- c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3)
Type <- c("A","A","A","B","B","B","A","A","A","B","B","B","A","A","A","B","B","B")
Value <- c(7,3,10,3,9,4,0,9,3,10,1,6,3,4,10,2,3,1)
df<-as.data.frame(cbind(Group,Day,Type,Value))
Test_Function <- function(Group_Name, Type_Name){
    paste(Group_Name,Type_Name) <- df[(df$Group == Group_Name] & (df$Type == Type_Name),]
}

В идеале

Test_Function("Secondary Group","A")

будет возвращать только строки 7-9 в сохраненном, используемом data.frame имени "Secondary Group A",

Спасибо!Любая помощь будет потрясающей.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Есть одна проблема с вашим набором данных.Значения вашей основной группы состоят из двух разделенных слов.Тогда он не будет работать для именования объекта (насколько я знаю)

Затем, если вы измените имена, чтобы сделать то одно слово (я покажу вам ниже, но изменить только первое дляНапример, я полагаю, у вас есть более длинный набор данных, поэтому вам, возможно, придется сделать это в R)

Group <- c("Primary_Group","Primary_Group","Primary_Group","Primary_Group","Primary_Group","Primary_Group","Secondary Group","Secondary Group","Secondary Group","Secondary Group","Secondary Group","Secondary Group","Tertiary Group","Tertiary Group","Tertiary Group","Tertiary Group","Tertiary Group","Tertiary Group")
Day <- c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3)
Type <- c("A","A","A","B","B","B","A","A","A","B","B","B","A","A","A","B","B","B")
Value <- c(7,3,10,3,9,4,0,9,3,10,1,6,3,4,10,2,3,1)
df<-as.data.frame(cbind(Group,Day,Type,Value))

Тогда следующая функция выполнит эту работу:

SelFun <- function(Data, Group,Type){
      df <- Data[Data$Group== Group & Data$Type== Type, ]
      assign(paste(Group,Type,sep = ''), df, envir = parent.frame()) 
}

Пример:

SelFun(df, 'Primary_Group', 'A')

Создает data.frame с именем Primary_GroupA, который будет включать выбранные строки

> Primary_GroupA
          Group Day Type Value
1 Primary_Group   1    A     7
2 Primary_Group   2    A     3
3 Primary_Group   3    A    10
0 голосов
/ 06 июня 2018

Вы могли бы сделать что-то вроде этого.

Test_Function <- function(df, Group_Name, Type_Name) {
    return(subset(df, Group == Group_Name & Type == Type_Name))
}

Secondary_Group_A <- Test_Function(df, "Secondary Group", "A");
Secondary_Group_A;
#            Group Day Type Value
#7 Secondary Group   1    A     0
#8 Secondary Group   2    A     9
#9 Secondary Group   3    A     3

Несколько комментариев:

  1. Я бы сделал df аргументом функции Test_Function;в противном случае df внутри Test_Function должна быть глобальной переменной.
  2. Мы можем использовать subset для фильтрации строк;в качестве альтернативы используйте df[df$Group == Group_Name & df$Type == Type_Name, ].
  3. Вам необходимо сохранить data.frame возвращаемый объект Test_Function;здесь возвращаемый объект Secondary_Group_A.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...