У меня есть огромная (~ 10 миллиардов строк) data.frame, которая выглядит примерно так:
data <- data.frame(Person = c(rep("John", 9), rep("Steve", 7), rep("Jane", 4)),
Year = c(1900:1908, 1902:1908, 1905:1908),
Grade = c(c(6,3,4,4,8,5,2,9,7), c(4,3,5,5,6,4,7), c(3,7,2,9)) )
Это набор из 3 человек, наблюдавшихся в разные годы, и у нас есть их Оценка заГод под вопросом.Я хотел бы создать переменную, которая для каждой оценки возвращает «упрощенную оценку».Упрощенная оценка - это просто Оценка, разрезанная через различные интервалы.Сложность в том, что интервалы у человека разные.Чтобы получить пороговые значения интервалов по Персоне, у меня есть следующий список:
list.threshold <- list(John = c(5,7), Steve = 4, Jane = c(3,5,8))
Таким образом, оценки Стива будут сокращены в 2 интервала, а оценки Джейн - в 4 интервала.Вот требуемые результаты (SimpleGrade):
Person Year Grade SimpleGrade
1: John 1900 6 1
2: John 1901 3 0
3: John 1902 4 0
4: John 1903 4 0
5: John 1904 8 2
6: John 1905 5 1
7: John 1906 2 0
8: John 1907 9 2
9: John 1908 7 2
10: Steve 1902 4 1
11: Steve 1903 3 0
12: Steve 1904 5 1
13: Steve 1905 5 1
14: Steve 1906 6 1
15: Steve 1907 4 1
16: Steve 1908 7 1
17: Jane 1905 3 1
18: Jane 1906 7 2
19: Jane 1907 2 0
20: Jane 1908 9 3
Мне нужно будет найти решение в sparklyr, потому что я работаю с огромной таблицей искр.
В dplyr я бы сделал что-нибудькак это:
dplyr
data <- group_by(data, Person) %>%
mutate(SimpleGrade = cut(Grade, breaks = c(-Inf, list.threshold[[unique(Person)]], Inf), labels = FALSE, right = TRUE, include.lowest = TRUE) - 1)
Это работает, но у меня возникают проблемы с преобразованием этого решения в sparklyr из-за того, что пороги для каждого человека различны.Я думаю, что мне придется использовать функцию ft_bucketizer.Где я до сих пор с sparklyr:
sparklyr
spark_tbl <- group_by(spark_tbl, Person) %>%
ft_bucketizer(input_col = "Grade",
output_col = "SimpleGrade",
splits = c(-Inf, list.threshold[["John"]], Inf))
spark_tbl - только эквивалент таблицы искровых данных.Это работает, если я не изменяю пороги и использую, например, только значения Джона.
Большое спасибо, Том С.