PU
Size: a a a
PU
PD
АК
ED
mydata = data.frame(
Months = c(1 ,1 ,1 , 2, 2, 2),
Strings = rep(c('1', '2', '3', '1', '3', '4'))
)
И
я хочу автоматически найти количество строк, которые не повторятся в следующем месяцеoutput = mydata %>%
nest(Nested = -Months) %>%
arrange(Months) %>%
mutate(Lost= map(Nested, lag(Nested), .f = function(.CurrentMonth, .PreviousMonth){
length(keep(.PreviousMonth$Strings ,!.PreviousMonth$Strings %in% .CurrentMonth$Strings))
}))
Но все значения в Lost
равны 0.length(keep(output$Nested[[1]]$Strings, !output$Nested[[1]]$Strings %in% output$Nested[[2]]$Strings ))дает верный результат.
data.table
можно сделать что-то такоеmydata <- data.table(
Months = c(1 ,1 ,1 , 2, 2, 2, 3,3,3,3),
Strings = c('1', '2', '3', '1', '3', '4', '1', '2', '3', '4')
)
mydata[, .(all_strings = list(Strings)), by = .(Months)][
, :=(New = c(list(NA), lapply(2:.N, function(i) setdiff(all_strings[[i]], all_strings[[i-1]]))),
Lost = c(list(NA), lapply(2:.N, function(i) setdiff(all_strings[[i-1]], all_strings[[i]]))),
Common = c(list(NA), lapply(2:.N, function(i) intersect(all_strings[[i]], all_strings[[i-1]]))))][]
Months all_strings New Lost Common
1: 1 1,2,3 NA NA NA
2: 2 1,3,4 4 2 1,3
3: 3 1,2,3,4 2 1,3,4
DI
data.table
можно сделать что-то такоеmydata <- data.table(
Months = c(1 ,1 ,1 , 2, 2, 2, 3,3,3,3),
Strings = c('1', '2', '3', '1', '3', '4', '1', '2', '3', '4')
)
mydata[, .(all_strings = list(Strings)), by = .(Months)][
, :=(New = c(list(NA), lapply(2:.N, function(i) setdiff(all_strings[[i]], all_strings[[i-1]]))),
Lost = c(list(NA), lapply(2:.N, function(i) setdiff(all_strings[[i-1]], all_strings[[i]]))),
Common = c(list(NA), lapply(2:.N, function(i) intersect(all_strings[[i]], all_strings[[i-1]]))))][]
Months all_strings New Lost Common
1: 1 1,2,3 NA NA NA
2: 2 1,3,4 4 2 1,3
3: 3 1,2,3,4 2 1,3,4
map
на map2
тоже решение проблемыDI
АК
DI
map
АК
map
library(data.table)Последнюю строку можно разложить так:
mydata = data.table(
Months = c(1 ,1 ,1 , 2, 2, 2, 3, 3, 3),
Strings = rep(c('1', '2', '3', '1', '3', '4', '1', '2', '5'))
)
res <- mydata[, .(Strings = list(Strings)), keyby = .(Months)]
# если без keyby, то нужен setorder(res, Months)
res[, cnt := mapply(function(x, y) sum(x %chin% y), Strings, c(tail(Strings, -1), NA_character_))]
res[, Strings2 := shift(.(Strings), type = "lead")]
res[, cnt := mapply(function(x, y) sum(x %in% y), Strings, Strings2)]
DI
library(data.table)Последнюю строку можно разложить так:
mydata = data.table(
Months = c(1 ,1 ,1 , 2, 2, 2, 3, 3, 3),
Strings = rep(c('1', '2', '3', '1', '3', '4', '1', '2', '5'))
)
res <- mydata[, .(Strings = list(Strings)), keyby = .(Months)]
# если без keyby, то нужен setorder(res, Months)
res[, cnt := mapply(function(x, y) sum(x %chin% y), Strings, c(tail(Strings, -1), NA_character_))]
res[, Strings2 := shift(.(Strings), type = "lead")]
res[, cnt := mapply(function(x, y) sum(x %in% y), Strings, Strings2)]
(keyby = .(Months))
АК
(keyby = .(Months))
setDT(mydata)
PU
IR
filter(mtcars, eval(parse(text = "cyl")) == 6)
filter(mtcars, get("cyl") == 6)
filter(mtcars, !!sym("cyl") == 6)
filter(mtcars, .data[["cyl"]] == 6)
O
O
AS
filter(mtcars, eval(parse(text = "cyl")) == 6)
filter(mtcars, get("cyl") == 6)
filter(mtcars, !!sym("cyl") == 6)
filter(mtcars, .data[["cyl"]] == 6)
AS
MM
IR
PU