Возможные альтернативы для цикла for, которые быстрее? [Дубликат]

$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
37
задан Community 14 July 2015 в 00:24
поделиться

7 ответов

R имеет «подязык» для перевода формул в матрицу дизайна, и в духе языка вы можете воспользоваться им. Это быстро и лаконично. Пример: у вас есть кардинальный предиктор x, категориальный предиктор catVar и ответ y.

> binom <- data.frame(y=runif(1e5), x=runif(1e5), catVar=as.factor(sample(0:4,1e5,TRUE)))
> head(binom)
          y          x catVar
1 0.5051653 0.34888390      2
2 0.4868774 0.85005067      2
3 0.3324482 0.58467798      2
4 0.2966733 0.05510749      3
5 0.5695851 0.96237936      1
6 0.8358417 0.06367418      2

Вы просто выполняете

> A <- model.matrix(y ~ x + catVar,binom) 
> head(A)
  (Intercept)          x catVar1 catVar2 catVar3 catVar4
1           1 0.34888390       0       1       0       0
2           1 0.85005067       0       1       0       0
3           1 0.58467798       0       1       0       0
4           1 0.05510749       0       0       1       0
5           1 0.96237936       1       0       0       0
6           1 0.06367418       0       1       0       0

Выполнено.

49
ответ дан gappy 20 August 2018 в 19:25
поделиться
  • 1
    Любой простой способ двигаться в противоположном направлении - т. Е. У вас есть фиктивные переменные, но они хотят свернуть их в одну переменную? – Misha 25 November 2011 в 00:35
  • 2
    обратите внимание: если вы измените используемый тип контрастов, вы получите разные результаты. Кроме того, вы получите разные ответы для заказа неупорядоченных факторов. Контрасты по умолчанию, установленные в R, равны options(contrasts = c("contr.treatment", "contr.poly")). См. ?contrasts, чтобы добавить к вашему замешательству. – geneorama 19 November 2013 в 21:59
  • 3
    Также обратите внимание, что здесь приведен пример 5 категорий, потому что индекс начинается с 0 sample(0:4, 1e5 , TRUE). Я не думаю, что в базе R можно автоматически генерировать все уровни фиктивных переменных. В этом конкретном примере происходит опускание любых выборок 0, которые будут отображаться в виде строки нулей в матрице модели. – geneorama 19 November 2013 в 22:04
  • 4
    Этот метод катит строки с NA, что заставляет меня предпочесть ответ Джошуа Ульриха. И для уточнения точки генерации, для n уровней переменной вам нужно только n-1 фиктивных переменных для представления информации. (Если по какой-то причине вы хотели взломать model.matrix(), чтобы явно представлять все столбцы, вы можете добавить ссылочный уровень без членов, как в levels(binom$catVar) <- c("dummy", levels(binom$catVar)); A <- model.matrix(y ~ x + catVar,binom, contrasts = "contr.treatment"), но это избыточность кажется рискованным, если вы делаете моделирование.) – MattBagg 23 June 2014 в 21:29
  • 5
    если вы не хотите перехвата, используйте A <- model.matrix(y ~ x + catVar -1, binom) – Manoj Kumar 19 June 2018 в 17:08

Если вы открыты для использования пакета data.table , mltools имеет метод one_hot ().

library(data.table)
library(mltools)

binom <- data.table(y=runif(1e5), x=runif(1e5), catVar=as.factor(sample(0:4,1e5,TRUE)))
one_hot(binom)

                 y          x catVar_0 catVar_1 catVar_2 catVar_3 catVar_4
     1: 0.90511891 0.83045050        0        0        1        0        0
     2: 0.91375984 0.73273830        0        0        0        1        0
     3: 0.01926608 0.10301409        0        0        1        0        0
     4: 0.48691138 0.24428157        0        1        0        0        0
     5: 0.60660396 0.09132816        0        0        1        0        0
    ---                                                                   
 99996: 0.12908356 0.26157731        0        1        0        0        0
 99997: 0.96397273 0.98959000        0        1        0        0        0
 99998: 0.16818414 0.37460941        1        0        0        0        0
 99999: 0.72610508 0.72055867        1        0        0        0        0
100000: 0.89710998 0.24155507        0        0        0        0        1
2
ответ дан Ben 20 August 2018 в 19:25
поделиться

Как насчет использования model.matrix ()?

> binom <- data.frame(data=runif(1e5),type=sample(0:4,1e5,TRUE))
> head(binom)
       data type
1 0.1412164    2
2 0.8764588    2
3 0.5559061    4
4 0.3890109    3
5 0.8725753    3
6 0.8358100    1
> inds <- model.matrix(~ factor(binom$type) - 1)
> head(inds)
  factor(binom$type)0 factor(binom$type)1 factor(binom$type)2 factor(binom$type)3 factor(binom$type)4
1                   0                   0                   1                   0                   0
2                   0                   0                   1                   0                   0
3                   0                   0                   0                   0                   1
4                   0                   0                   0                   1                   0
5                   0                   0                   0                   1                   0
6                   0                   1                   0                   0                   0
16
ответ дан griverorz 20 August 2018 в 19:25
поделиться
  • 1
    что, если переменная типа имеет значения NA? Как мы можем сохранить значения NA в качестве отдельной переменной в дополнение к 1 и 0? – Scott Davis 11 September 2014 в 00:23
  • 2
    Введите значения NA в значение, отличное от NA. – Tommyixi 15 March 2017 в 04:50

Пакет nnet для однослойных нейронных сетей (которые не понимают факторы) имеет команду преобразования: class.ind.

0
ответ дан Jim Bang 20 August 2018 в 19:25
поделиться

Дрю, это намного быстрее и не должно вызывать сбоев.

> binom <- data.frame(data=runif(1e5),type=sample(0:4,1e5,TRUE))
> for(t in unique(binom$type)) {
+   binom[paste("type",t,sep="")] <- ifelse(binom$type==t,1,0)
+ }
> head(binom)
        data type type2 type4 type1 type3 type0
1 0.11787309    2     1     0     0     0     0
2 0.11884046    4     0     1     0     0     0
3 0.92234950    4     0     1     0     0     0
4 0.44759259    1     0     0     1     0     0
5 0.01669651    2     1     0     0     0     0
6 0.33966184    3     0     0     0     1     0
24
ответ дан Joshua Ulrich 20 August 2018 в 19:25
поделиться
  • 1
    хорошее решение. Могу ли я предложить, прежде чем «вставить»? чтобы включить немного "make.names" если имена уровней содержат какой-то спорный характер. – agenis 30 July 2014 в 17:24

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

library(recipes)

binom <- data.frame(y = runif(1e5), 
                    x = runif(1e5),
                    catVar = as.factor(sample(0:4, 1e5, TRUE))) # use the example from gappy
head(binom)

new_data <- recipe(y ~ ., data = binom) %>% 
  step_dummy(catVar) %>% # add dummy variable
  prep(training = binom) %>% # apply the preprocessing steps (could be more than just adding dummy variables)
  bake(newdata = binom) # apply the recipe to new data
head(new_data)

Другими примерами шагов являются step_scale, step_center, step_pca и т. Д.

0
ответ дан takje 20 August 2018 в 19:25
поделиться

ifelse векторизован, поэтому, если я правильно понимаю ваш код, вам это не нужно sapply. И я бы не использовал слияние - я бы использовал SQLite или PostgreSQL.

Некоторые примеры данных тоже помогли бы: -)

0
ответ дан Vince 20 August 2018 в 19:25
поделиться
Другие вопросы по тегам:

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