Компактная версия data.frame

Кадр данных:

200.01  117:10520   227137.56097561
200.01  155:24  227137.56097561
200.01  265:47  227137.56097561
200.01  266:37  227137.56097561
200.01  281:568 227137.56097561
200.01  282:246 227137.56097561
200.31  190:3374    227360
200.56  110:1261    227545.365853659
200.56  186:571 227545.365853659
200.66  114:969 227619.512195122
200.66  118:3886    227619.512195122

Данные представлены. Вопрос: я хочу сделать одну строку из дублированных столбцов. Пример :

200.01  117:10520 155:24 265:47  266:37 281:568 282:246 227137.56097561

person alap    schedule 29.11.2012    source источник
comment
Вы хотите, чтобы они все отображались в одном столбце? или во многих столбцах? похоже, вам может понадобиться список, в котором каждый элемент может быть любой длины   -  person Justin    schedule 29.11.2012
comment
Я хочу, как в примере. Таким образом, в основном пример будет 1 строкой, а после алгоритма будет 4 строки с: 200,01 200,31 200,56 200,66. И я бы создал новую рамку   -  person alap    schedule 29.11.2012
comment
Я думаю, что вопрос @Justin заключался в том, должно ли 117:10520 ... 282:246 быть одним столбцом или шестью столбцами. Мне это кажется очень простым применением aggregate(), если требуется один столбец.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 29.11.2012
comment
@mrdwab правильно. особенно если количество повторяющихся записей может существенно различаться, вам будет лучше обслуживать именованный список, а не многоколоночный разреженный data.frame.   -  person Justin    schedule 29.11.2012
comment
Это должен быть один столбец. Ага. Можете ли вы предложить решение?   -  person alap    schedule 29.11.2012


Ответы (1)


Как упоминалось в комментариях, это довольно простой aggregate вопрос:

Ваши данные:

dat <- read.table(header = FALSE, stringsAsFactors=FALSE, text = "
                    200.01  117:10520   227137.56097561
                    200.01  155:24  227137.56097561
                    200.01  265:47  227137.56097561
                    200.01  266:37  227137.56097561
                    200.01  281:568 227137.56097561
                    200.01  282:246 227137.56097561
                    200.31  190:3374    227360
                    200.56  110:1261    227545.365853659
                    200.56  186:571 227545.365853659
                    200.66  114:969 227619.512195122
                    200.66  118:3886    227619.512195122")

Два варианта объединения. В первом V2 это list. Во втором варианте V2 — это строка символов.

aggregate(V2 ~ V1 + V3, dat, c)
#       V1       V3                                                  V2
# 1 200.01 227137.6 117:10520, 155:24, 265:47, 266:37, 281:568, 282:246
# 2 200.31 227360.0                                            190:3374
# 3 200.56 227545.4                                   110:1261, 186:571
# 4 200.66 227619.5                                   114:969, 118:3886
aggregate(V2 ~ V1 + V3, dat, paste, collapse=" ")
#       V1       V3                                             V2
# 1 200.01 227137.6 117:10520 155:24 265:47 266:37 281:568 282:246
# 2 200.31 227360.0                                       190:3374
# 3 200.56 227545.4                               110:1261 186:571
# 4 200.66 227619.5                               114:969 118:3886

См. также: R Функции группировки: sapply vs. lapply vs. apply. по принципу tapply, по или по совокупности


Если требуется несколько столбцов, вы все равно можете агрегировать, а затем разделить столбцы позже с помощью пользовательской функции. Одним из примеров является функция tableFlatten, совместно используемая @RicardoSaporta, которая создаст столько столбцов, сколько ваш самый длинный элемент списка. Но, как упоминал @Justin в комментариях, список может быть более полезным в зависимости от того, что вы пытаетесь сделать.

dat2 <-  aggregate(V2 ~ V1 + V3, dat, c)
(dat2 <- tableFlatten(dat2))
#       V1       V3     V2.01    V2.02  V2.03  V2.04   V2.05   V2.06
# 1 200.01 227137.6 117:10520   155:24 265:47 266:37 281:568 282:246
# 2 200.31 227360.0  190:3374                                       
# 3 200.56 227545.4  110:1261  186:571                              
# 4 200.66 227619.5   114:969 118:3886 
person A5C1D2H2I1M1N2O1R2T1    schedule 29.11.2012