【问题标题】:str_extract_all returns a list but I want a vectorstr_extract_all 返回一个列表,但我想要一个向量
【发布时间】:2016-02-22 02:42:35
【问题描述】:

这里对 R 来说还是比较新的。我有一列推文,我正在尝试创建一个包含转发句柄“RT @blahblah”的列,如下所示:

Tweets                            Retweetfrom
RT @john I had a good day         RT @john
RT @josh I had a bad day          RT @josh

这是我的代码:

r$Retweetfrom <- str_extract_all(r$Tweets, "^RT[:space:]+@[:graph:]+")

它给了我很好的结果,但是新列不是一个向量,而是一个列表。当我尝试取消列出它时,它会抛出一个错误:

Error in `$<-.data.frame`(`*tmp*`, "Retweetfrom", value = c("@AlpineITW", "@AllScienceGlobe",  : replacement has 1168 rows, data has 2306

有人知道如何处理吗?非常感谢。

【问题讨论】:

    标签: r stringr


    【解决方案1】:

    如果我们对base R 选项感兴趣,sub 将很有用

    r$Retweetfrom <- sub(".*\\b(RT\\s+@[[:graph:]]+)\\s+.*", 
                             "\\1", r$Tweets)
    r$Retweetfrom
    #[1] "RT @john" "RT @josh"
    

    【讨论】:

      【解决方案2】:

      假设在Tweets 列的每一行中只有一个 RT @user(不是一个非常强的假设),那么您可能只想要 str_extract(它将在字符串上矢量化)而不是 str_extract_all(可能每行返回多个结果)。即

      r$Retweetfrom <- str_extract(r$Tweets, "^RT[:space:]+@[:graph:]+")
      

      在这种情况下,您将第一次提到 RT @user,这可能是您想要的。

      【讨论】:

      • 啊,有道理,谢谢!但是,如果我试图提取推文中的所有提及项怎么办?有时在一条推文中会多次提及。
      • 这是一个稍微不同的问题;您目前的正则表达式捕获了 RT 给出的人(我第一次错过了)您在正则表达式中使用 ^,所以您最多只能得到一个(我又不好,错过了 + ; 你会得到他们所有)。如果您想捕获推文中提到的所有 @user,无论他们是否进行了 RT,那么您需要决定如何将可变大小列表存储在 data.frame 中。
      • 现在更有意义了。非常感谢乔纳森!
      • 很确定你可以只做'simplify = T',它会将结果变成一个可变大小的矩阵。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2011-11-15
      • 2013-11-12
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多