Сделайте строки в столбцы и сохраните дату [дубликат]

Начиная с jQuery 1.7, вы должны использовать jQuery.fn.on :

$(staticAncestors).on(eventName, dynamicChild, function() {});

До этого рекомендуется использовать live() :

$(selector).live( eventName, function(){} );

Однако live() устарел в 1.7 в пользу on() и полностью удален в 1.9. Подпись live():

$(selector).live( eventName, function(){} );

... может быть заменена следующей on() сигнатурой:

$(document).on( eventName, selector, function(){} );

Например, если ваша страница динамически создавала элементы с именем класса dosomething, вы привязывали бы событие к родительскому, который уже существует (здесь есть нуль проблемы, вам нужно что-то, что существует для привязки, не привязка к динамическому контенту), это может быть (и самый простой вариант) - document. Хотя иметь в виду document, возможно, не самый эффективный вариант .

$(document).on('mouseover mouseout', '.dosomething', function(){
    // what you want to happen when mouseover and mouseout 
    // occurs on elements that match '.dosomething'
});

Любой родитель, который существует в момент привязки события, прекрасен. Например,

$('.buttons').on('click', 'button', function(){
    // do something here
});

применимо к

178
задан Taryn 22 March 2017 в 17:25
поделиться

9 ответов

Использование функции reshape:

reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
174
ответ дан Chase 19 August 2018 в 01:13
поделиться
  • 1
    +1, и вам не нужно полагаться на внешние пакеты, так как reshape поставляется с stats. Не говоря уже о том, что это быстрее! знак равно – aL3xa 5 May 2011 в 01:07
  • 2
    Удачи, выясняя аргументы, которые вам нужны, хотя – hadley 5 May 2011 в 02:40
  • 3
    @hadley, yepp ... это правда! знак равно – aL3xa 5 May 2011 в 10:45
  • 4
    reshape является выдающимся примером для API ужасной функции. Он очень близок к бесполезности. – NoBackingDown 26 October 2017 в 15:18
  • 5
    Комментарии reshape и похожие имена аргументов не так полезны. Тем не менее, я обнаружил, что в течение длительного времени вам необходимо предоставить data = ваш data.frame, idvar = переменную, которая идентифицирует ваши группы, v.names = переменные, которые станут многочисленными столбцами в широком формате, timevar = переменная, содержащая значения, которые будут добавлены к v.names в широком формате, direction = wide и sep = "_". Достаточно ясно? ;) – Brian D 17 November 2017 в 18:11

Функция base reshape работает отлично:

df <- data.frame(
  year   = c(rep(2000, 12), rep(2001, 12)),
  month  = rep(1:12, 2),
  values = rnorm(24)
)
df_wide <- reshape(df, idvar="year", timevar="month", v.names="values", direction="wide", sep="_")
df_wide

Здесь idvar - столбец классов, который разделяет строки, timevar - столбец классов, который должен быть широко представлен, v.names - это столбец, содержащий числовые значения, direction указывает широкий или длинный формат, а необязательный аргумент sep - это разделитель, используемый между именами классов timevar и v.names на выходе data.frame. Если нет idvar, создайте его перед использованием функции reshape():

df$id   <- c(rep("year1", 12), rep("year2", 12))
df_wide <- reshape(df, idvar="id", timevar="month", v.names="values", direction="wide", sep="_")
df_wide

Просто помните, что требуется idvar! Часть timevar и v.names проста. Выход этой функции более предсказуем, чем некоторые другие, поскольку все явно определено.

0
ответ дан Adam Erickson 19 August 2018 в 01:13
поделиться

Вы можете сделать это с помощью функции reshape() или с функциями melt() / cast() в пакете reshape. Для второго варианта пример кода:

library(reshape)
cast(dat1, name ~ numbers)

Или с помощью reshape2

library(reshape2)
dcast(dat1, name ~ numbers)
62
ответ дан David Arenburg 19 August 2018 в 01:13
поделиться
  • 1
    Спасибо! Я не могу поверить, что не видел этого - я просто посмотрел на «бросок» перед публикацией, но не мог заставить его работать, как я хотел. – Steve 4 May 2011 в 23:45
  • 2
    +1 И используйте reshape2 для увеличения производительности. – Andrie 6 May 2011 в 12:56
  • 3
    Возможно, стоит отметить, что просто использование cast или dcast не будет работать хорошо, если у вас нет четкого «значения», колонка. Попробуйте dat <- data.frame(id=c(1,1,2,2),blah=c(8,4,7,6),index=c(1,2,1,2)); dcast(dat, id ~ index); cast(dat, id ~ index), и вы не получите то, что ожидаете. Вам нужно явно указать value/value.var - cast(dat, id ~ index, value="blah") и dcast(dat, id ~ index, value.var="blah"), например. – thelatemail 21 June 2017 в 22:37

В Win-Vector есть очень мощный новый пакет от ученых гениальных данных (люди, которые делали vtreat, seplyr и replyr), называемые cdata. Он реализует принципы «скоординированных данных», описанные в в этом документе , а также в этом сообщении в блоге . Идея заключается в том, что независимо от того, как вы организуете свои данные, должно быть возможно идентифицировать отдельные точки данных с помощью системы «координат данных». Вот отрывок из недавнего сообщения в блоге от John Mount:

Вся система основана на двух примитивах или операторах cdata :: moveValuesToRowsD () и cdata :: moveValuesToColumnsD (). Эти операторы имеют сводную, разворотную, однострочную кодировку, транспонирование, перемещение нескольких строк и столбцов и многие другие преобразования как простые частные случаи.

Легко написать много разных операций в терминах примитивов cdata. Эти операторы могут работать как в памяти, так и в больших масштабах данных (с базами данных и Apache Spark, для больших данных используются варианты cdata :: moveValuesToRowsN () и cdata :: moveValuesToColumnsN ()). Трансформации управляются таблицей управления, которая сама является диаграммой (или изображением) преобразования.

Сначала мы создадим контрольную таблицу (см. сообщение в блоге для получения подробной информации), а затем выполнить перемещение данных из строк в столбцы.

library(cdata)
# first build the control table
pivotControlTable <- buildPivotControlTableD(table = dat1, # reference to dataset
                        columnToTakeKeysFrom = 'numbers', # this will become column headers
                        columnToTakeValuesFrom = 'value', # this contains data
                        sep="_")                          # optional for making column names

# perform the move of data to columns
dat_wide <- moveValuesToColumnsD(tallTable =  dat1, # reference to dataset
                    keyColumns = c('name'),         # this(these) column(s) should stay untouched 
                    controlTable = pivotControlTable# control table above
                    ) 
dat_wide

#>         name  numbers_1  numbers_2  numbers_3  numbers_4
#> 1  firstName  0.3407997 -0.7033403 -0.3795377 -0.7460474
#> 2 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
3
ответ дан dmi3kno 19 August 2018 в 01:13
поделиться

Новый (в 2014 году) tidyr пакет также делает это просто, при этом gather() / spread() является слагаемыми для melt / cast.

library(tidyr)
spread(dat1, key = numbers, value = value)

Из github ,

tidyr - это перерисовка reshape2, предназначенная для сопровождения аккуратной структуры данных и работающая рука об руку с magrittr и dplyr, чтобы построить сплошной конвейер для анализа данных.

Так же, как reshape2 сделал меньше, чем изменение, tidyr делает меньше, чем reshape2. Он разработан специально для сбора данных, а не для общей перестройки, которую делает reshape2, или общего преобразования, которое изменилось. В частности, встроенные методы работают только для кадров данных, а tidyr не содержит полей или агрегации.

91
ответ дан Gregor 19 August 2018 в 01:13
поделиться
  • 1
    Просто хотел добавить ссылку на страницу R Cookbook , в которой обсуждается использование этих функций из tidyr и reshape2. Это дает хорошие примеры и объяснения. – Jake 12 April 2017 в 13:01

Другие два варианта:

Базовый пакет:

df <- unstack(dat1, form = value ~ numbers)
rownames(df) <- unique(dat1$name)
df

sqldf package:

library(sqldf)
sqldf('SELECT name,
      MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1, 
      MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2,
      MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3,
      MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4
      FROM dat1
      GROUP BY name')
13
ответ дан mpalanco 19 August 2018 в 01:13
поделиться

Использование базовой функции R aggregate:

aggregate(value ~ name, dat1, I)

# name           value.1  value.2  value.3  value.4
#1 firstName      0.4145  -0.4747   0.0659   -0.5024
#2 secondName    -0.8259   0.1669  -0.8962    0.1681
6
ответ дан Onyambu 19 August 2018 в 01:13
поделиться
  • 1
    зачем использовать функцию paste вместо функции I (функция идентификации)? – Onyambu 25 December 2017 в 05:04

Другим вариантом, если производительность является проблемой, является использование расширения data.table для расширения reshape2 расплава & amp; dcast functions

( Ссылка: эффективная перестройка с использованием data.tables )

library(data.table)

setDT(dat1)
dcast(dat1, name ~ numbers, value.var = "value")

#          name          1          2         3         4
# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078
# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814

И, как и в data.table v1.9.6, мы можем использовать несколько столбцов

## add an extra column
dat1[, value2 := value * 2]

## cast multiple value columns
dcast(dat1, name ~ numbers, value.var = c("value", "value2"))

#          name    value_1    value_2   value_3   value_4   value2_1   value2_2 value2_3  value2_4
# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078  0.3672866 -1.6712572 3.190562 0.6590155
# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814 -1.6409368  0.9748581 1.476649 1.1515627
24
ответ дан SymbolixAU 19 August 2018 в 01:13
поделиться
  • 1
    data.table подход лучший! очень эффективный ... вы увидите разницу, когда name представляет собой комбинацию из 30-40 столбцов! – joel.wilson 31 August 2017 в 12:06
  • 2
    Я лично считаю, что это лучший ответ – cloudscomputes 20 October 2017 в 04:37

Используя ваш пример dataframe, мы могли бы:

xtabs(value ~ name + numbers, data = dat1)
22
ответ дан zx8754 19 August 2018 в 01:13
поделиться
  • 1
    этот результат хорош, но результатом является таблица формата, которая не может быть не так проста в обращении как data.frame или data.table, у обоих есть много пакетов – cloudscomputes 20 October 2017 в 04:44
Другие вопросы по тегам:

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