Свернуть по датам - PullRequest
       1

Свернуть по датам

0 голосов
/ 10 сентября 2018
ID     DocDate  Price   Name
212 3/6/2017    4     abc
212 1/9/2017    3     def
212 1/20/2017   2     ghi
212 3/17/2017   5     jkl

У меня есть фрейм данных, как указано выше при программировании на R. Мне нужно свернуть удостоверение личности, основываясь на самых старых и самых новых датах, как показано ниже

ID            Price/Name
212 (3/def), (2/ghi), (4/abc), (5/jkl)

Так как в 2017 году на первом месте стоит 1/9, затем на 1/20 и так далее.

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018
xy <- read.table(text = "    ID    DocDate  Price   Name
    212 3/6/2017    4     abc
                 212    1/9/2017    3     def
                 212    1/20/2017   2     ghi
                 212    3/17/2017   5     jkl", header = TRUE)

lapply(split(xy, f = xy$ID), FUN = function(x) {
  # if you have a proper date, you can sort it using order()
  date <- as.Date(x$DocDate, format = "%m/%d/%y")

  # construct a string to output
  outstring <- sprintf("(%s/%s)", x$Price, x$Name)
  outstring <- outstring[order(date)] # order it
  outstring <- paste(outstring, collapse = ", ") # paste it into a comma delimited string

  out <- data.frame(ID = unique(x$ID), PriceName = outstring)
  out
})

$`212`
   ID                          PriceName
1 212 (3/def), (2/ghi), (4/abc), (5/jkl)

Вы можете объединить конечный результат, используя do.call(rbind, X), предполагая, что вы сохраните результат в X.

0 голосов
/ 10 сентября 2018

Другой метод с использованием dplyr и tidyr:

library(dplyr)
library(tidyr)

df %>%
  group_by(ID) %>%
  arrange(DocDate = as.Date(DocDate)) %>%
  unite("Price_Name", Price, Name, sep = "/") %>%
  summarize(Price_Name = paste0("(", Price_Name, ")", collapse = ", "))

или просто:

df %>%
  group_by(ID) %>%
  arrange(DocDate = as.Date(DocDate)) %>%
  summarize(Price_Name = paste0("(", Price, "/", Name, ")", collapse = ", "))

Выход:

# A tibble: 1 x 2
     ID Price_Name                        
  <int> <chr>                             
1   212 (3/def), (4/abc), (2/ghi), (5/jkl)

Данные:

df <- structure(list(ID = c(212L, 212L, 212L, 212L), DocDate = structure(c(4L, 
2L, 1L, 3L), .Label = c("1/20/2017", "1/9/2017", "3/17/2017", 
"3/6/2017"), class = "factor"), Price = c(4L, 3L, 2L, 5L), Name = structure(1:4, .Label = c("abc", 
"def", "ghi", "jkl"), class = "factor")), .Names = c("ID", "DocDate", 
"Price", "Name"), class = "data.frame", row.names = c(NA, -4L
))
0 голосов
/ 10 сентября 2018

Попробуйте это:

library(dplyr)
library(magrittr)

dt <- read.table(textConnection(
"ID     DocDate  Price   Name
212    3/6/2017    4     abc
212    1/9/2017    3     def
212    1/20/2017   2     ghi
212    3/17/2017   5     jkl"), header = TRUE)

custom_format <- function(price, name){
  paste0("(", price, "/", name, ")")
}

dt %>%
  mutate(DocDate = as.Date(DocDate, "%m/%d/%Y")) %>%
  arrange(DocDate) %>%
  mutate(value = custom_format(Price, Name)) %>%
  group_by(ID) %>%
  distinct(value) %>%
  summarize(value = paste(value, collapse = ", "))

# A tibble: 1 x 2
     ID value                             
  <int> <chr>                             
1   212 (3/def), (2/ghi), (4/abc), (5/jkl)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...