Size: a a a

R (язык программирования)

2020 November 18

PU

Philipp Upravitelev in R (язык программирования)
все будет про dt. скоро анонс повешу. предварительно - во вторник в 20 часов по мск.
источник

PD

Pavel Demin in R (язык программирования)
Артём Клевцов
На SO есть несколько вопросов с ответами. Если искал, то должен был наткнуться. Более-менее информативный привожу сюда: https://stackoverflow.com/a/57917822/1863950
сильно, спасибо!
я на SO, как и в гугле, редко листаю вниз
хорошая идея делать get() оба раза. никогда не использовал `get(x, pos = 1L)`
источник

АК

Артём Клевцов... in R (язык программирования)
Pavel Demin
сильно, спасибо!
я на SO, как и в гугле, редко листаю вниз
хорошая идея делать get() оба раза. никогда не использовал `get(x, pos = 1L)`
Вариант с использование ключа мне показался интересным.
источник

ED

Evgeniy Dolgin in R (язык программирования)
Daryna Ivaskevych
Всем привет! У меня есть вопрос по работе с map.

У меня имеется вот такой вот датасет

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

Daryna Ivaskevych in R (язык программирования)
Evgeniy Dolgin
через 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

Daryna Ivaskevych in R (язык программирования)
@artemklevtsov , спасибо, хорошее решение было
источник

АК

Артём Клевцов... in R (язык программирования)
Оно неправильно работает.
источник

DI

Daryna Ivaskevych in R (язык программирования)
Я не успела проверить, но спасибо за подсказку с еще одним map
источник

АК

Артём Клевцов... in R (язык программирования)
Daryna Ivaskevych
Я не успела проверить, но спасибо за подсказку с еще одним 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

Daryna Ivaskevych in R (язык программирования)
Артём Клевцов
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))
источник

АК

Артём Клевцов... in R (язык программирования)
Daryna Ivaskevych
У меня не работает: неиспользованный аргумент (keyby = .(Months))
setDT(mydata)
источник

PU

Philipp Upravitelev in R (язык программирования)
Юрий 🐙💻🤖📊📈🚬
шикарная задачка в одном из курсов по статистике
а еще есть?
источник
2020 November 19

IR

Ignatius Reilly in R (язык программирования)
Forgive me father for I have sinned...
Каюсь, сегодня пришлось воспользоваться data-masking, потому что просили именно на tidyverse написать.
Объясните мне, грешному, что ж нынче в моде для того, чтобы по текстовому значению отфильтровать дата фрейм?
Я тут посидел, повспоминал варианты. Уверен, что можно и больше вспомнить, если постараться.
filter(mtcars, eval(parse(text = "cyl")) == 6)
filter(mtcars, get("cyl") == 6)
filter(mtcars, !!sym("cyl") == 6)
filter(mtcars, .data[["cyl"]] == 6)

#ОсторожноTidyverse!
источник

O

Olya in R (язык программирования)
не грешить!
источник

O

Olya in R (язык программирования)
и все сразу получится)
источник

AS

Anton Silchenko in R (язык программирования)
Ignatius Reilly
Forgive me father for I have sinned...
Каюсь, сегодня пришлось воспользоваться data-masking, потому что просили именно на tidyverse написать.
Объясните мне, грешному, что ж нынче в моде для того, чтобы по текстовому значению отфильтровать дата фрейм?
Я тут посидел, повспоминал варианты. Уверен, что можно и больше вспомнить, если постараться.
filter(mtcars, eval(parse(text = "cyl")) == 6)
filter(mtcars, get("cyl") == 6)
filter(mtcars, !!sym("cyl") == 6)
filter(mtcars, .data[["cyl"]] == 6)

#ОсторожноTidyverse!
Просто фильтр по значению?
источник

AS

Anton Silchenko in R (язык программирования)
mtcars %>% filter( cyl == "6")
источник

MM

Mikle Mikle in R (язык программирования)
mtcars %>% filter(str_detect(cyl, '6'))
источник

IR

Ignatius Reilly in R (язык программирования)
Да не, ребят, именно текстовый вектор, когда я заранее не знаю, будет ли там "cyl" или "wt" или ещё чего. Или например когда у вас есть много таких переменных и вы запускаете это в цикле.
источник

PU

Philipp Upravitelev in R (язык программирования)
Ignatius Reilly
Да не, ребят, именно текстовый вектор, когда я заранее не знаю, будет ли там "cyl" или "wt" или ещё чего. Или например когда у вас есть много таких переменных и вы запускаете это в цикле.
не очень понятно, честно говоря, в чем проблема
источник