【问题标题】:Accessing element of a split string in R在R中访问拆分字符串的元素
【发布时间】:2016-12-26 21:49:28
【问题描述】:

如果我有一个字符串,

x <- "Hello World"

如何在之后使用字符串拆分访问第二个单词“World”

x <- strsplit(x, " ")

x[[2]] 什么都不做。

【问题讨论】:

  • 它是x[[1]][2]strsplit 返回一个列表。拆分字符串位于列表结果的第一个元素中。 "World" 是该元素的第二个值。也可以scan(text = x, what = "")[2]

标签: r string


【解决方案1】:

如 cmets 中所述,重要的是要意识到 strsplit 返回一个列表对象。由于您的示例仅拆分单个项目(长度为 1 的向量),因此您的列表长度为 1。我将用一个稍微不同的示例进行解释,输入长度为 3 的向量(要拆分的 3 个文本项目):

input <- c( "Hello world", "Hi there", "Back at ya" )

x <- strsplit( input, " " )

> x
[[1]]
[1] "Hello" "world"

[[2]]
[1] "Hi"    "there"

[[3]]
[1] "Back" "at"   "ya"  

请注意,返回的列表有 3 个元素,输入向量的每个元素一个。这些列表元素中的每一个都根据strsplit 调用进行拆分。所以我们可以使用[[ 调用这些列表元素中的任何一个(这就是你的x[[2]] 调用所做的,但你只有一个列表元素,这就是为什么你无法得到任何回报):

> x[[1]]
[1] "Hello" "world"

> x[[3]]
[1] "Back" "at"   "ya" 

现在我们可以通过附加[ 调用来获取这些列表元素的第二部分:

> x[[1]][2]
[1] "world"

> x[[3]][2]
[1] "at"

这将返回每个列表元素的第二个项目(请注意,在这种情况下,“Back at ya”输入已返回“at”)。您可以使用apply 系列中的内容一次对所有项目执行此操作。 sapply 将返回一个向量,在这种情况下可能会很好:

> sapply( x, "[", 2 )
[1] "world" "there" "at"

此处输入的最后一个值 (2) 被传递给 [ 运算符,这意味着运算 x[2] 应用于每个列表元素。

如果您想要每个列表元素的 last 项而不是第二项,我们可以在 sapply 调用中使用 tail 代替 [

> sapply( x, tail, 1 )
[1] "world" "there" "ya"

这一次,我们将tail( x, 1 ) 应用于每个列表元素,为我们提供最后一项。

作为偏好,我最喜欢应用此类操作的方式是使用 magrittr 管道,第二个词如下:

x <- input %>%
    strsplit( " " ) %>%
    sapply( "[", 2 )

> x
[1] "world" "there" "at"

最后一句话:

x <- input %>%
    strsplit( " " ) %>%
    sapply( tail, 1 )

> x
[1] "world" "there" "ya" 

【讨论】:

    【解决方案2】:

    另一种可能更容易阅读并应用于管道中的数据帧(尽管需要更多行)的方法是将其包装在您自己的函数中并应用它。

    library(tidyverse)
    
    df <- data.frame(
      greetings = c( "Hello world", "Hi there", "Back at ya" )
    )
    
    split_params = function (x, sep, n) {
      # Splits string into list of substrings separated by 'sep'.
      # Returns nth substring.
      x = strsplit(x, sep)[[1]][n]
      
      return(x)
    }
    
    
    df = df %>%
      mutate(
        'greetings' = sapply(
          X = greetings,
          FUN = split_params,
          # Arguments for split_params.
          sep = ' ',
          n = 2
        )
      )
    
    df
    
    ### (Output in RStudio Notebook)
    
    greetings   second_word
    <chr>       <chr>
    Hello world world           
    Hi there    there           
    Back at ya  at          
    3 rows
    ###
    

    【讨论】:

      【解决方案3】:
      x=strsplit("a;b;c;d",";")
      

      x

      [[1]] [1] "a" "b" "c" "d"

      x=as.character(x[[1]])
      

      x

      [1]“a”“b”“c”“d”

      x=strsplit(x," ")
      

      x

      [[1]] [1] “一”

      [[2]] [1] "b"

      [[3]] [1] "c"

      [[4]] [1] “d”

      【讨论】:

      • 使用代码格式来获得更漂亮的答案,并提供一些关于您的示例的作用的解释。
      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多