从R中的列中的每个值中删除最后一个字符

时间:2016-12-01 00:37:03

标签: r regex

我使用以下代码提取数据。

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...|
+----+--------------------+----+--------------------+

description

现在我想删除每个movie_title中的最后一个术语,并为此编写了以下代码。

imdb_movie_data <-read.csv("https://raw.githubusercontent.com/sundeepblue/movie_rating_prediction/master/movie_metadata.csv")

但这并不是从列中删除最后一个字符。如果有人需要澄清,请告诉我。

2 个答案:

答案 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]+")

你最终获得除了任何特殊角色之外的所有角色。