В старом фрейме данных упорядочите по двум столбцам и сохраните первый из каждой строки в новом фрейме данных

r

62 просмотра

3 ответа

389 Репутация автора

У меня есть фрейм данных, который содержит 3 столбца, и я хотел бы использовать столбцы dateи locationполучить самое последнее наблюдение каждого местоположения и сохранить его в новом фрейме данных.

> old.data
date location amount
2014 NY       1
2015 NJ       2
2016 NY       3
2015 NM       4
2013 NY       5
2014 NJ       6
2016 NM       7
2016 NJ       8
2015 NY       9

> new.data
date location amount
2016 NJ       8
2016 NM       7
2016 NY       3
Автор: Provisional.Modulation Источник Размещён: 18.07.2016 04:46

Ответы (3)


4 плюса

3978 Репутация автора

Решение

Использование dplyr:

library(dplyr)

new.data <- old.data %>% arrange(desc(date), location) %>% group_by(location) %>% slice(1)

new.data

Source: local data frame [3 x 2]
Groups: location [3]

   date location
  <int>   <fctr>
1  2016       NJ
2  2016       NM
3  2016       NY

Использование data.table:

library(data.table)
# Code updated by Arun
setDT(old.data)[order(-date, location), .(date = date[1L]), by = location]

   location date
1:       NJ 2016
2:       NM 2016
3:       NY 2016

Данные

old.data <- structure(list(date = c(2014L, 2015L, 2016L, 2015L, 2013L, 2014L, 
2016L, 2016L, 2015L), location = structure(c(3L, 1L, 3L, 2L, 
3L, 1L, 2L, 1L, 3L), .Label = c("NJ", "NM", "NY"), class = "factor")), .Names = c("date", 
"location"), class = "data.frame", row.names = c(NA, -9L))

Обновить (так как OP изменил исходный фрейм данных)

dplyrРешение остается в силе.

Ибо data.tableэто единственный способ, которым я мог придумать:

setDT(old.data)[order(-date, location), colnames(old.data), with = F][date == max(date)]

   date location amount  
1: 2016       NJ      8 
2: 2016       NM      7
3: 2016       NY      3

Использование .SD и .SDcols в соответствии с предложением Аруна

# adding more data
old.data$amount <- 1:9
old.data$a <- 10:18

# Retain all columns
keep_cols <- colnames(old.data)[-2] # Remove the column which is mentioned in by

setDT(old.data)[order(-date, location), .SD[1L], by = location, .SDcols = keep_cols]

# or assigning colnames to .SDcols directly: 

setDT(old.data)[order(-date, location), .SD[1L], by = location, .SDcols = (colnames(old.data)[-2])]

   location date amount  a
1:       NJ 2016      8 17
2:       NM 2016      7 16
3:       NY 2016      3 12
Автор: Sumedh Размещён: 18.07.2016 04:50

2 плюса

6449 Репутация автора

Как насчет этого:

library(dplyr)
date <- c(2014, 2015, 2016, 2015, 2013, 2014, 2016, 2016, 2015)
location <- c("NY", "NJ", "NY", "NM", "NY", "NJ", "NM", "NJ", "NY")

old.data <- data.frame(date, location)

new.data <- group_by(old.data, location)

new.data <- summarise(new.data, year = max(date))
Автор: blacksite Размещён: 18.07.2016 04:58

2 плюса

4914 Репутация автора

Используя data.tableпакет:

library(data.table)
setDT(dat)[order(-date), .SD[1L], by = location]
#    location date
# 1:       NY 2016
# 2:       NM 2016
# 3:       NJ 2016
Автор: dayne Размещён: 18.07.2016 05:11
Вопросы из категории :
32x32