在R编程语言中,我可以做到:
x <- c(1, 8, 3, 5, 6)
y <- rep("Down",5)
y[x>5] <- "Up"
这将导致y向量为("Down", "Up", "Down", "Down", "Up")
现在我的x序列是线性模型拟合上predict
函数的输出。 R中的predict
函数返回一个序列,而Spark中的predict
函数返回一个DataFrame,其中包含test-dataset +列label
和prediction
的列。
运行
y[x$prediction > .5]
我收到错误:
Error in y[x$prediction > 0.5] : invalid subscript type 'S4'
我该如何解决这个问题?
答案 0 :(得分:1)
选择行时
您的方法不起作用,因为作为Spark y
的产品的predict
是Spark(而不是R)数据帧;你应该使用SparkR的filter
功能。以下是使用iris
数据集的可重现示例:
library(SparkR)
sparkR.version()
# "2.2.1"
df <- as.DataFrame(iris)
df
# SparkDataFrame[Sepal_Length:double, Sepal_Width:double, Petal_Length:double, Petal_Width:double, Species:string]
nrow(df)
# 150
# Let's keep only the records with Petal_Width > 0.2:
df2 <- filter(df, df$Petal_Width > 0.2)
nrow(df2)
# 116
同时查看docs中的示例。
关于替换行值:
替换Spark数据帧中的行值的标准做法是首先创建一个具有所需条件的新列,然后可能删除旧列;这是一个示例,我们将Petal_Width
的值大于0.2
的值替换为我们在上面定义的df
中的0&#39;
newDF <- withColumn(df, "new_PetalWidth", ifelse(df$Petal_Width > 0.2, 0, df$Petal_Width))
head(newDF)
# result:
Sepal_Length Sepal_Width Petal_Length Petal_Width Species new_PetalWidth
1 5.1 3.5 1.4 0.2 setosa 0.2
2 4.9 3.0 1.4 0.2 setosa 0.2
3 4.7 3.2 1.3 0.2 setosa 0.2
4 4.6 3.1 1.5 0.2 setosa 0.2
5 5.0 3.6 1.4 0.2 setosa 0.2
6 5.4 3.9 1.7 0.4 setosa 0.0 # <- value changed
# drop the old column:
newDF <- drop(newDF, "Petal_Width")
head(newDF)
# result:
Sepal_Length Sepal_Width Petal_Length Species new_PetalWidth
1 5.1 3.5 1.4 setosa 0.2
2 4.9 3.0 1.4 setosa 0.2
3 4.7 3.2 1.3 setosa 0.2
4 4.6 3.1 1.5 setosa 0.2
5 5.0 3.6 1.4 setosa 0.2
6 5.4 3.9 1.7 setosa 0.0
该方法也适用于不同的列;以下是值为0或Petal_Width
的新列的示例,具体取决于Petal_Length
的条件:
newDF2 <- withColumn(df, "something_here", ifelse(df$Petal_Length > 1.4, 0, df$Petal_Width))
head(newDF2)
# result:
Sepal_Length Sepal_Width Petal_Length Petal_Width Species something_here
1 5.1 3.5 1.4 0.2 setosa 0.2
2 4.9 3.0 1.4 0.2 setosa 0.2
3 4.7 3.2 1.3 0.2 setosa 0.2
4 4.6 3.1 1.5 0.2 setosa 0.0
5 5.0 3.6 1.4 0.2 setosa 0.2
6 5.4 3.9 1.7 0.4 setosa 0.0