【问题标题】:Best approach to remove all parts of data column that don't match any part of a list?删除与列表的任何部分不匹配的数据列的所有部分的最佳方法?
【发布时间】:2018-01-06 08:31:46
【问题描述】:

我有一个数据框,其中包含一列歌曲标题、标签信息和其他杂乱的字符串数据。我还有一个特定歌曲标题的孤立向量。我想从歌曲标题中过滤掉所有不匹配歌曲的角色。我正在使用类似的东西,但显示错误。

song.list <- c("Song.1","Song.2", "Song.3")
Mydata$Songs <- My data column containing all sorts of things including the songs I'm after

 levels(Mydata$Songs)[(Mydata$Songs) %in% song.list] <- "" #I'd like the opposite of this
 levels(Mydata$Songs)![(Mydata$Songs) %in% song.list] <- ""#My use of '!' doesn't work

我知道在没有 ! 的情况下使用上述索引可以用空格替换我的歌曲列表,但我正在尝试用空格替换其他所有内容。我的列表中有大约 29 首歌曲,单列中有大约 1000 行杂乱的字符串数据。我也试过 gsub 和 grep 无济于事。

【问题讨论】:

  • 您将! 放在错误的位置! [!(Mydata$Songs) %in% song.list].

标签: r vector indexing replace


【解决方案1】:

我无法提出矢量化解决方案,但如果我理解正确的话,这个因子水平上的循环应该可以完成这项工作:

library(stringr)

for (level in levels(df$A)) {
  match <- na.omit(str_extract(level, song.list))
  if (length(match) > 0) {
    levels(df$A)[levels(df$A) == level] <- match
  }
}

原始答案没有按照 OP 的意图进行

我不确定我是否完全理解你想要做什么,但我认为这就是你所追求的。不过,这不会删除行!

levels(Mydata$Songs)[!Mydata$Songs %in% song.list] <- ""

【讨论】:

  • 嗨 Oriol,谢谢。这接近我想要做的,但我想过滤掉与歌曲列表不匹配的字符串部分。基本上,我正在尝试将歌曲从杂乱无章的字符串列中拉出来。
  • 你能给我举个例子Mydata$Songs的几行内容吗?有了这些信息,我应该可以为您提供帮助。
  • 嗨 Oriol,这是数据列第一行包含内容的示例:[1] Walkin' Blues (as R. Johnson)\n \n \n Raw Hide - \n \ n Assorted Studio Recordings 1987-1991 ‎(CDr, Comp, Ltd) 我想抽出像“Walkin Blues”这样的歌曲。每行包含不同的歌曲和其他字符串数据。
  • 我在答案中添加了解决此问题的新尝试。如果有任何问题,请告诉我。
  • 嗨 Oriol,谢谢,这似乎很好用。我试图做一些类似的事情,但我还差得很远。谢谢你的帮助;我已为您的答案添加了“检查”。
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 2014-03-16
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
相关资源
最近更新 更多