подмножество последовательности данных - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь начать использовать R для анализа данных, и у меня есть вопрос о подмножестве ряда фреймов данных.

Итак, допустим, у меня есть фреймы данных с именами i1, i2, i3, ..., i10

Я хотел бы поместить эти кадры данных в подмножество и присвоить результат sub1, sub2, sub3, ..., sub10.Затем объедините результаты.

то, что я хочу для каждого фрейма данных:

sub1 <- subset(i1, F < (mean(i1$F)-2*sd(i1$F)) |
                     F > (mean(i1$F)+2*sd(i$F)))

, однако с попыткой назначить и вставить, также создав список i1, .., i10, но яне удалось добиться, чтобы сделать это в цикле.

Кто-нибудь может порекомендовать способ сделать это?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Кроме того, мы можем объединить все фреймы данных в один большой фрейм данных и применить операции по группам .

Для этого требуется, чтобы фреймы данных имели одинаковую структуру, т. Е. Одинаковый порядок, имя и тип столбцов, что, как представляется, имеет место в данном случае.

Для групповых операций над фреймами данных мы можем использовать синтаксис data.table или dplyr (помимо базовых функций R).

data.table

library(data.table)
list_of_df <- mget(paste0("i", 1:10))
big_dt <- rbindlist(list_of_df, idcol = "orig.df")

big_dt[, .SD[!F %between% (mean(F) + c(-2, +2) * sd(F))], by = orig.df]
   orig.df rn   F x
1:      i2  6  20 P
2:      i3  6  30 M
3:      i4  6  40 I
4:      i5  6  50 Y
5:      i6  6  60 U
6:      i7  6  70 T
7:      i8  6  80 F
8:      i9  6  90 G
9:     i10  6 100 F

dplyr

library(dplyr)
list_of_df <- mget(paste0("i", 1:10))
big_df <- list_of_df %>% 
  bind_rows(.id = "orig.df") 

big_df %>% 
  group_by(orig.df) %>% 
  filter(!between(F, mean(F) - 2 * sd(F), mean(F) + 2 * sd(F)))
# A tibble: 9 x 4
# Groups:   orig.df [9]
  orig.df    rn     F x    
  <chr>   <int> <dbl> <chr>
1 i2          6    20 P    
2 i3          6    30 M    
3 i4          6    40 I    
4 i5          6    50 Y    
5 i6          6    60 U    
6 i7          6    70 T    
7 i8          6    80 F    
8 i9          6    90 G    
9 i10         6   100 F

Воспроизводимые данные

Это создаст 10 фреймов данных в глобальной среде.

set.seed(1L)
n_row <- 6L
for (x in 1:10) {
  df_name <- paste0("i", x)
  assign(df_name,
         data.frame(
           rn = seq(n_row),
           F = c(rnorm(n_row - 1, mean = x), 10*x),
           x = sample(LETTERS, n_row, replace = TRUE),
           stringsAsFactors = FALSE
         ),
         envir = globalenv())
}

ls()
 [1] "df_name" "i1"      "i10"     "i2"      "i3"      "i4"      "i5"      "i6"      "i7"      "i8"      "i9"     
[12] "n_row"   "x"

Каждый фрейм данных состоит из 6 строк, где одна строка содержит выброс в F, например,

i3
  rn         F x
1  1  2.983810 U
2  2  3.943836 O
3  3  3.821221 N
4  4  3.593901 U
5  5  3.918977 A
6  6 30.000000 M
0 голосов
/ 19 апреля 2019

Мы можем получить наборы данных в list с mget

lst1 <- mget(paste0("i", 1:10))

, а затем выполните поднабор в пределах list

lst2 <- lapply(lst1, function(x) subset(x, F > (abs(mean(F) + 2 * sd(F))))
...