Получить счетчик изменения значения по уникальному идентификатору в R-кадре данных - PullRequest
0 голосов
/ 23 июня 2018

У меня как нижеприведенный кадр данных (Dput):

structure(list(ID = c("TTR-1", "TTR-1", "TTR-2", "TTR-2", "TTR-2", 
"TTR-3", "TTR-4", "TTR-4", "TTR-4", "TTR-5"), Value1 = c(100L, 
400L, 147L, 159L, 165L, 178L, 166L, 150L, 150L, 169L), Value2 = c(15, 
5.05, 13, 13, 13, 7.25, 11, 13, 15, 19), Value3 = c(25L, 25L, 
18L, 32L, 32L, 14L, 45L, 57L, 60L, 22L), Date = c("26/08/2017 06:08:12", 
"26/08/2017 15:45:18", "01/09/2017 12:04:16", "04/09/2017 15:02:47", 
"04/09/2017 18:22:15", "12/09/2017 19:07:17", "15/09/2017 21:19:19", 
"15/09/2017 22:12:47", "15/09/2017 23:15:18", "20/10/2017 09:37:14"
)), class = "data.frame", row.names = c(NA, -10L))

Я хочу классифицировать его на три разные категории.

Количество изменений в группе значений на ID с учетом даты начала до даты.

ID      Value1  Value2  Value3
TTR-1   1       1       0
TTR-2   2       0       1
TTR-3   0       0       0
TTR-4   1       2       2
TTR-5   0       0       0

Количество изменений в группе значений на Date (Количество изменений, внесенных в уникальный ID на эту дату).

Date        T   U   C     Value1    Value2  Value3
26/08/2017  2   1   1      1        0       1
01/09/2017  1   1   0      0        0       0
04/09/2017  2   0   1      2        0       1
12/09/2017  1   1   0      0        0       0 
15/09/2017  3   1   1      1        2       1
20/10/2017  1   1   0      0        0       0

Количество изменений в группе значений по месяцам.

Month   T  U  C     Value1  Value2  Value3
Aug-17  1  1  1     1       0       1
Sep-17  7  3  4     3       2       2
Oct-17  1  1  0     0       0       0

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

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

по ID

library(dplyr)
df <- df %>%
  mutate(d= as.Date(Date,"%d/%m/%Y"),
         m= format.Date(Date,"%m-%d"))

df %>% group_by(ID) %>%
  summarize_at(2:4,~sum(diff(.x)!=0))

# # A tibble: 5 x 4
#   ID    Value1 Value2 Value3
#   <chr>  <int>  <int>  <int>
# 1 TTR-1      1      1      0
# 2 TTR-2      2      0      1
# 3 TTR-3      0      0      0
# 4 TTR-4      1      2      2
# 5 TTR-5      0      0      0

по дате

df %>% group_by(ID,d) %>%
  summarize_at(2:4,~sum(diff(.x)!=0)) %>%
  group_by(d) %>%
  summarize_at(3:5,sum)

# # A tibble: 6 x 4
# d          Value1 Value2 Value3
# <date>      <int>  <int>  <int>
# 1 2017-08-26      1      1      0
# 2 2017-09-01      0      0      0
# 3 2017-09-04      1      0      0
# 4 2017-09-12      0      0      0
# 5 2017-09-15      1      2      2
# 6 2017-10-20      0      0      0

по месяцам

df %>% group_by(ID,m) %>%
  summarize_at(2:4,~sum(diff(.x)!=0)) %>%
  group_by(m) %>%
  summarize_at(3:5,sum)

# # A tibble: 3 x 4
#   m     Value1 Value2 Value3
#   <chr>  <int>  <int>  <int>
# 1 08-20      1      1      0
# 2 09-20      3      2      3
# 3 10-20      0      0      0
0 голосов
/ 24 июня 2018

Здесь представлен игровой способ подсчета уникального количества изменений по выбранной переменной, как определено в описании проблемы в базе R, с использованием данных OP в качестве фрейма данных DF:

DF <- within(DF, {Date <- as.Date(strptime(Date, "%d/%m/%Y %H:%M:%S"))
                  Month <- format(Date, '%m-%Y')})
cols <- c("Value1", "Value2", "Value3")
namesVector <- c("Date", "ID", "Month")
formulaChar <- paste0('column ~ ', namesVector)

for (i in seq_along(namesVector)){
  temp <- Reduce(function(x, y) merge(x, y, by = namesVector[i], all = T),
                 lapply(DF[, cols], 
                        function(column) aggregate(formula = as.formula(formulaChar[i]), 
                                                   data = DF, 
                                                   FUN = function(g) length(unique(g))-1)))
  names(temp) <- c(namesVector[i], cols)
  print(temp)
  assign(paste0("DFby", namesVector[i]), temp)
}

rm(cols, namesVector, formulaChar, i, temp)
0 голосов
/ 23 июня 2018

Мы можем сгруппировать по «ID», получить n_distinct для столбцов «Значение» и вычесть один

1) По ID

library(dplyr)
df1 %>% 
  group_by(ID) %>% 
  summarise_at(vars(starts_with("Value")), funs(n_distinct(.) -1))
# A tibble: 5 x 4
#  ID    Value1 Value2 Value3
#  <chr>  <dbl>  <dbl>  <dbl>
#1 TTR-1      1      1      0
#2 TTR-2      2      0      1
#3 TTR-3      0      0      0
#4 TTR-4      1      2      2
#5 TTR-5      0      0      0

2) По дате

Аналогичным образом, мы можем сделать это на основе изменения group_by переменных

library(lubridate)
df1 %>%
  group_by(Date =as.Date(dmy_hms(Date))) %>%       
  summarise_at(vars(starts_with("Value")), funs(n_distinct(.)-1)) 
# A tibble: 6 x 4
#  Date       Value1 Value2 Value3
#  <date>      <dbl>  <dbl>  <dbl>
#1 2017-08-26      1      1      0
#2 2017-09-01      0      0      0
#3 2017-09-04      1      0      0
#4 2017-09-12      0      0      0
#5 2017-09-15      1      2      2
#6 2017-10-20      0      0      0

3)По месяцам

library(zoo)
df1 %>%
    group_by(ID, Month = as.yearmon(Date, "%d/%m/%Y %H:%M:%S")) %>%
    summarise_at(vars(starts_with("Value")), funs(n_distinct(.)-1)) %>% 
    group_by(Month) %>%
    summarise_at(vars(starts_with("Value")), sum)
# A tibble: 3 x 4
#  Month         Value1 Value2 Value3
#  <S3: yearmon>  <dbl>  <dbl>  <dbl>
#1 Aug 2017           1      1      0
#2 Sep 2017           3      2      3
#3 Oct 2017           0      0      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...