Подмножество данных в рамках функции - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь ссылаться на столбцы с помощью функции.

Взять данные:

  dat = data.frame(height = c(20, 20, 40, 50, 60, 10), weight = c(100, 200, 300, 200, 140, 240),
               age = c(19, 20, 20, 19, 10, 11))
  Age_list <- c(19)

Взять пример:

toy_func <- function(df,list,column){

  for (i in list){
  toy_output <- df[,column == i]
  }

  Return(toy_output)
}

И запустить:

tst <- toy_func(dat,Age_list,"age")

Выходные данные представляют собой фрейм данных без переменных. Я хотел бы сгенерировать вывод, в котором исходный кадр данных dat был отфильтрован по возрастам, равным 19.

Цикл необходим, поскольку я планирую перебирать каждый уникальный элемент в столбце возраста. По сути, я пишу функцию для разделения фрейма данных по уникальным значениям в одном из его столбцов.

Заранее спасибо, John

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы можете попробовать

foo <- function(x, y, z) x[ x[[y]] %in% z, ]
foo(dat, "age", c(19, 20))
  height weight age
1     20    100  19
2     20    200  20
3     40    300  20
4     50    200  19

Если вам нужен вывод в виде отсортированного списка, вы можете написать

lapply(c(19,20), foo, x=dat, y="age")
[[1]]
  height weight age
1     20    100  19
4     50    200  19

[[2]]
  height weight age
2     20    200  20
3     40    300  20
0 голосов
/ 31 августа 2018

Используя советы @phiver, вы можете попробовать это:

dat = data.frame(height = c(20, 20, 40, 50, 60, 10),
                 weight = c(100, 200, 300, 200, 140, 240),
                 age = c(19, 20, 20, 19, 10, 11))
Age_list <- c(19,20)

for (i in Age_list){
  toy_output <- split(dat,dat$age==i)$`TRUE`
  print(toy_output)
  }

Результат:

  height weight age
1     20    100  19
4     50    200  19
  height weight age
2     20    200  20
3     40    300  20

EDIT:

Вы можете сделать простой обходной путь, чтобы поместить его в функцию:

toy_func <- function(df,list,x){

for (i in list){
  toy_output <- split(df,df[,x]==i)$`TRUE`
  print(toy_output)
              }
           }

toy_func(dat,Age_list ,3)

  height weight age
1     20    100  19
4     50    200  19
  height weight age
2     20    200  20
3     40    300  20

EDIT2:

И это даст вам data.frame с результатом со столбцом i, который сообщает вам, какая итерация генерирует каждую строку:

toy_func <- function(df,list,x){
   datalist = list()
        for (i in list){
            toy_output <- data.frame(split(df,df[,3]==i)$`TRUE`)
            toy_output$i <- i
            datalist[[i]] <- toy_output
                       }
   print(do.call(rbind, datalist))
  }

toy_func(dat,Age_list ,3)

  height weight age  i
5     60    140  10 10
2     20    200  20 20
3     40    300  20 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...