Создание нескольких подмножеств из фрейма данных [дубликат]

Решите эту проблему, активировав GHCI и набрав :set +m:

Prelude> :set +m
Prelude> let addTwo :: Int -> Int -> Int
Prelude|     addTwo x y = x + y
Prelude| 
Prelude> addTwo 1 3
4

Boom.


Что здесь происходит (и я говорю в основном о вы, человек, ищущий помощь в процессе работы Learn You A Haskell ) - это то, что GHCI - это интерактивная среда, в которой вы меняете привязки имен функций на лету. Вы должны обернуть определения своих функций в блок let, чтобы Haskell знал, что вы собираетесь что-то определить. Свойство :set +m является сокращением для многострочной конструкции :{ кода :}.

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

59
задан josliber 21 March 2016 в 15:07
поделиться

8 ответов

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

Например, если вы хотите оставить некоторые переменные, вы можете создавать новые кадры данных из определенных столбцы базы данных. Нижние индексы в скобках после кадра данных относятся к номерам строк и столбцов.

newdf <- mydf[,1:3]

Или вы можете выбрать определенные строки.

newdf <- mydf[1:3,]

И эти индексы также могут быть логическими тестами, такими как выбор строк, которые содержат определенное значение или факторы с желаемым значением.

Что вы хотите сделать с оставшимися кусками? Вам нужно выполнить одну и ту же операцию на каждом фрагменте базы данных? Затем вы захотите убедиться, что подмножества кадра данных попадут в удобный объект, например список, который поможет вам выполнить одну и ту же команду на каждом фрагменте кадра данных.

3
ответ дан Ben M 16 August 2018 в 04:50
поделиться

Я просто разместил своего рода RFC, который может вам помочь: Разделить вектор на куски в R

x = data.frame(num = 1:26, let = letters, LET = LETTERS)
## number of chunks
n <- 2
dfchunk <- split(x, factor(sort(rank(row.names(x))%%n)))
dfchunk
$`0`
   num let LET
1    1   a   A
2    2   b   B
3    3   c   C
4    4   d   D
5    5   e   E
6    6   f   F
7    7   g   G
8    8   h   H
9    9   i   I
10  10   j   J
11  11   k   K
12  12   l   L
13  13   m   M

$`1`
   num let LET
14  14   n   N
15  15   o   O
16  16   p   P
17  17   q   Q
18  18   r   R
19  19   s   S
20  20   t   T
21  21   u   U
22  22   v   V
23  23   w   W
24  24   x   X
25  25   y   Y
26  26   z   Z

Cheers, Sebastian

11
ответ дан Community 16 August 2018 в 04:50
поделиться

subset() также полезен:

subset(DATAFRAME, COLUMNNAME == "")

Для пакета опроса, возможно, пакет survey уместен?

http: // faculty. washington.edu/tlumley/survey/

7
ответ дан DJV 16 August 2018 в 04:50
поделиться

Если вы хотите разбить фрейм данных в соответствии со значениями некоторой переменной, я бы предложил использовать daply() из пакета plyr.

library(plyr)
x <- daply(df, .(splitting_variable), function(x)return(x))

Теперь x представляет собой массив данных. Чтобы получить доступ к одному из фреймов данных, вы можете проиндексировать его с именем уровня разделительной переменной.

x$Level1
#or
x[["Level1"]]

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

18
ответ дан JoFrhwld 16 August 2018 в 04:50
поделиться
  • 1
    пожалуйста, сообщите заранее пакет, из которого не-базовая функция - предположительно вы имеете в виду daply из пакета plyr? – mdsumner 21 July 2010 в 21:12
  • 2
    Я загрузил plyr в свой фрагмент кода, поэтому я подумал, что это понятно, но я буду редактировать прозу ответов для ясности. – JoFrhwld 21 July 2010 в 21:18
  • 3
    Разве вы не имеете в виду dlply? – hadley 21 July 2010 в 21:33
  • 4
    Сначала я предложил dlply, но он автоматически не назвал записи переменной группировки. Я не знаю, что я сделал первым, но, по-видимому, daply не работает, если не указана функция. Я отредактировал ответ на работу. – JoFrhwld 21 July 2010 в 22:03

Вы также можете сократить кадр данных на произвольное число меньших кадров данных. Здесь мы нарезаем два кадра данных.

x = data.frame(num = 1:26, let = letters, LET = LETTERS)
set.seed(10)
split(x, sample(rep(1:2, 13)))

дает

$`1`
   num let LET
3    3   c   C
6    6   f   F
10  10   j   J
12  12   l   L
14  14   n   N
15  15   o   O
17  17   q   Q
18  18   r   R
20  20   t   T
21  21   u   U
22  22   v   V
23  23   w   W
26  26   z   Z

$`2`
   num let LET
1    1   a   A
2    2   b   B
4    4   d   D
5    5   e   E
7    7   g   G
8    8   h   H
9    9   i   I
11  11   k   K
13  13   m   M
16  16   p   P
19  19   s   S
24  24   x   X
25  25   y   Y

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

split(mtcars,mtcars$cyl)
52
ответ дан joran 16 August 2018 в 04:50
поделиться
  • 1
    Привет, greg, я не мог понять синтаксис команды sample, можете ли вы это объяснить. – Anirudh 1 February 2015 в 10:45
  • 2
    «Возможно, вам также захочется вырезать фрейм данных на произвольное количество меньших кадров данных. Здесь мы разрезаем на два кадра данных. & Quot; Как это произвольное количество кадров данных, если вы указываете здесь два кадра данных? – user5359531 16 March 2016 в 18:09
  • 3
    @ user5359531, произвольные два кадра данных. – Demo 10 December 2016 в 22:28

Разделение кадра данных кажется контрпродуктивным. Вместо этого используйте парадигму split-apply-comb, например, сгенерируйте некоторые данные

df = data.frame(grp=sample(letters, 100, TRUE), x=rnorm(100))

, затем разделите только соответствующие столбцы и примените функцию scale() к x в каждой группе и объедините результаты ( используя split<- или ave)

df$z = 0
split(df$z, df$grp) = lapply(split(df$x, df$grp), scale)
## alternative: df$z = ave(df$x, df$grp, FUN=scale)

Это будет очень быстро по сравнению с расщеплением data.frames, и результат остается пригодным для последующего анализа без итерации. Я думаю, что синтаксис dplyr -

library(dplyr)
df %>% group_by(grp) %>% mutate(z=scale(x))

. В общем случае это решение dplyr быстрее, чем разделение кадров данных, но не так быстро, как split-apply-comb.

2
ответ дан Martin Morgan 16 August 2018 в 04:50
поделиться

Если вы хотите разбить по значениям в одном из столбцов, вы можете использовать lapply. Например, чтобы разделить ChickWeight на отдельный набор данных для каждого цыпленка:

data(ChickWeight)
lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,])
3
ответ дан mikeck 16 August 2018 в 04:50
поделиться

Вы также можете использовать

data2 <- data[data$sum_points == 2500, ]

. Это сделает блок данных со значениями, где sum_points = 2500

Он дает:

airfoils sum_points field_points   init_t contour_t   field_t
...
491        5       2500         5625 0.000086  0.004272  6.321774
498        5       2500         5625 0.000087  0.004507  6.325083
504        5       2500         5625 0.000088  0.004370  6.336034
603        5        250        10000 0.000072  0.000525  1.111278
577        5        250        10000 0.000104  0.000559  1.111431
587        5        250        10000 0.000072  0.000528  1.111524
606        5        250        10000 0.000079  0.000538  1.111685
....
> data2 <- data[data$sum_points == 2500, ]
> data2
airfoils sum_points field_points   init_t contour_t   field_t
108        5       2500          625 0.000082  0.004329  0.733109
106        5       2500          625 0.000102  0.004564  0.733243
117        5       2500          625 0.000087  0.004321  0.733274
112        5       2500          625 0.000081  0.004428  0.733587
10
ответ дан Ronak Shah 16 August 2018 в 04:50
поделиться
  • 1
    привет, как бы вы пошли, если бы вы хотели разбить его динамически на другой data_frame, основанный на уникальных значениях в этом столбце.? – kRazzy R 6 April 2017 в 02:54
Другие вопросы по тегам:

Похожие вопросы: