【发布时间】:2019-07-25 17:29:45
【问题描述】:
我有一个巨大的(约 100 亿行)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 个区间,而 Jane 的成绩将被削减 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 中找到解决方案,因为我正在使用一个巨大的 spark 表。
在 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 只是数据的火花表等价物。 例如,如果我不更改阈值并仅使用 John 的阈值,它就会起作用。
非常感谢,汤姆 C。
【问题讨论】:
标签: r apache-spark dplyr sparklyr