我使用以下代码提取数据。
import scala.collection.mutable.WrappedArray
import org.apache.spark.sql.functions.col
val splitArr = udf { (s: String) => s.split(",").map(_.trim) }
val commonLen = udf { (a: WrappedArray[String],
b: WrappedArray[String]) => a.intersect(b).length }
val temp = (result.withColumn("concatArr",
splitArr(col("concatCSV"))).select(col("*"),
commonLen(col("triplet"), col("concatArr")).alias("comm"))
.filter(col("comm") >= 2)
.drop("comm")
.drop("concatArr"))
temp.show
+----+--------------------+----+--------------------+
|id_A| concatCSV|id_B| triplet|
+----+--------------------+----+--------------------+
| 14|StringD, StringB,...| 21|[StringA, StringF...|
| 18|StringA, StringB,...| 21|[StringA, StringF...|
+----+--------------------+----+--------------------+
现在我想删除每个movie_title中的最后一个术语,并为此编写了以下代码。
imdb_movie_data <-read.csv("https://raw.githubusercontent.com/sundeepblue/movie_rating_prediction/master/movie_metadata.csv")
但这并不是从列中删除最后一个字符。如果有人需要澄清,请告诉我。
答案 0 :(得分:1)
两个问题:
1)imdb_movie_data $ movie_title不是字符向量,而是一个因子向量,因此需要转换为as.character
2)如果您希望转换产生持久影响,则需要为imdb_movie_data$movie_title
分配一个值:
imdb_movie_data$movie_title <- substr(as.character(imdb_movie_data$movie_title),
start= 1,
stop= nchar(as.character(imdb_movie_data$movie_title) )-1 )
> head(imdb_movie_data$movie_title)
[1] "Avatar "
[2] "Pirates of the Caribbean: At World's End "
[3] "Spectre "
[4] "The Dark Knight Rises "
[5] "Star Wars: Episode VII - The Force Awakens "
[6] "John Carter "
在R中,仅仅运行函数的行为对函数的参数没有影响。如果要更改值,则需要将分配回原始向量。
答案 1 :(得分:1)
简单的方法是使用正则表达式。以下命令可以帮助 -
imdb_movie_data$movie_title<-str_extract_all(imdb_movie_data$movie_title,"[A-Z a-z]+")
你最终获得除了任何特殊角色之外的所有角色。