Как создать несколько фреймов данных из одного фрейма данных с несколькими условиями в R - PullRequest
2 голосов
/ 20 марта 2020

Я хотел бы создать four наборы данных из следующего заданного фрейма данных с помощью нескольких условий в x1 и x2

mydata=structure(list(y = c(-3, 24, 4, 5, 3, -3, -3, 24, 5, 4, 8, 7, 
                            9, 2, 4, 8, 7, 3, 8, 12, 9, 10, 12, 11, 2), 
                      x1 = c(0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 
                             0, 1, 0, 1, 1, 0, 0, 1, 1, 1
                            ), 
                      x2 = c(1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 
                             0, 1, 0, 0, 1, 1, 1, 0)), class = "data.frame", 
                 row.names = c(NA,25L))

Первый набор данных - mydata00, который построен с этими условиями x1=0 и x2=0,

mydata00=filter(mydata, c(mydata$x1==0 & mydata$x2==0))
> mydata00
   y x1 x2
1 -3  0  0
2 -3  0  0
3  8  0  0
4  3  0  0
5  9  0  0

Теперь мне нужны только значения unique y и соответствующие x1 и x2. Наконец, я бы хотел отсортировать y. Таким образом, мой окончательный набор данных должен выглядеть следующим образом:

   y  x1 x2

1 -3  0  0
2  3  0  0
3  8  0  0
4  9  0  0

Я хотел бы выполнить работу для mydata11, mydata10, mydata01, где

mydata11=filter(mydata, c(mydata$x1==1 & mydata$x2==1))
mydata10=filter(mydata, c(mydata$x1==1 & mydata$x2==0))
mydata01=filter(mydata, c(mydata$x1==0 & mydata$x2==1))

Могу ли я использовать любой для l oop или встроенную функцию для создания этих наборов данных? Любая помощь приветствуется.

1 Ответ

2 голосов
/ 20 марта 2020

Мы можем split данные, основанные на уникальных значениях x1 и x2, и получать unique строк в каждом списке после упорядочивания их по y.

temp <- lapply(split(mydata, list(mydata$x1, mydata$x2)), function(x) 
                     unique(x[order(x$y), ]))
temp

#$`0.0`
#    y x1 x2
#6  -3  0  0
#18  3  0  0
#16  8  0  0
#21  9  0  0

#$`1.0`
#    y x1 x2
#14  2  1  0
#5   3  1  0
#10  4  1  0
#4   5  1  0
#...

Если нам нужны данные как отдельный фрейм данных, мы можем назвать их соответствующим образом и использовать list2env.

names(temp) <- paste0("mydata", names(temp))
list2env(temp, .GlobalEnv)

tidyverse способ сделать это будет:

library(tidyverse)
mydata %>% group_split(x1, x2) %>% map(~.x %>% arrange(y) %>% distinct)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...