在R中查找字符串的中点(单词的中间字符)

时间:2015-06-10 20:55:11

标签: r

我希望在完成以下任务后找到任何字词的中点:

>x = 'hello'
>y = strsplit(x, '')
>y
[[1]]
[1] "h" "e" "l" "l" "o"
>z = unlist(y)
>z
[1] "h" "e" "l" "l" "o"

执行此操作然后允许:

> z[1]
[1] "h"
> z[4]
[1] "l"

不同之处在于z=unlist(y)尝试z[index]之前,您回来NA,例如:

> x = 'hello'
> strsplit(x, '')
[[1]]
[1] "h" "e" "l" "l" "o"
> x[1]
[1] "hello"
> x[2]
[1] NA

无论如何,我想要做的是找到这种格式的单词的中点,以便输出如下:

"l"

在单词" hello"的情况下。此外,在这个例子中,我们有一个带有5个字母的单词,允许轻松地将单个字符指定为中点,但是对于像" bake"我想指定两个" a"和" k"一起作为中点。

5 个答案:

答案 0 :(得分:5)

尝试

f1 <- function(str1){
    N <- nchar(str1)
     if(!N%%2){
      res <- substr(str1, N/2, (N/2)+1) 
     }
     else{

   N1 <- median(sequence(N))
   res <- substr(str1, N1, N1)
    }
   res
  }

f1('bake')
#[1] "ak"
f1('hello')
#[1] "l"

答案 1 :(得分:4)

另一种选择。根据您的描述, If( InStr( sUrl, "?" ) = 0 ) Then sURL = sURL & "?p=1" window.location.href = sURL & "?p=1" End If 假定该字词已被拆分为字符:

get_middle

然后:

get_middle <- function(x) {
  mid <- (length(x) + 1) / 2
  x[unique(c(ceiling(mid), floor(mid)))]
}

产地:

words <- c("bake", "hello")
lapply(strsplit(words, ""), get_middle)

答案 2 :(得分:2)

你可以试试这个:

midpoint <- function(word) {
    # Split the word into a vector of letters
    split <- strsplit(word, "")[[1]]

    # Get the number of letters in the word
    n <- nchar(word)

    # Get the two middle letters for words of even length,
    # otherwise get the single middle letter
    if (n %% 2 == 0) {
        c(split[n/2], split[n/2+1])
    } else {
        split[ceiling(n/2)]
    }
}

如果是长度均匀的单词,则将中间的两个字符作为向量返回。

midpoint("hello")
#[1] "l"

midpoint("bake")
#[1] "a" "k"

答案 3 :(得分:1)

怎么样:

mid<-function(str)substr(str,(nchar(str)+1)%/%2,(nchar(str)+2)%/%2)

或稍微清晰一点:

mid2<-function(str){
  n1<-nchar(str)+1
  substr(str,n1%/%2,(n1+1)%/%2)
}

> mid("bake")
[1] "ak"
> mid("hello")
[1] "l"

这样做的好处是可以立即进行矢量化:

> mid(c("bake","hello"))
[1] "ak" "l" 

对于长词而言,它比@ akrun的解决方案慢,但我的第二个版本更快;显然,计算字符对于较长的字符串来说可能是昂贵的。

如果您希望列表中的最终产品,只需strsplit结果:

mid3<-function(str)strsplit(mid2(str),"")

答案 4 :(得分:0)

word = c("bake","hello")
print(nchar(word))
q = ifelse (nchar(word)%%2==0, substr(word,nchar(word)/2,nchar(word)/2+1),substr(word,nchar(word)/2+1,nchar(word)/2+1))
print(q)

[1] 4 5
[1] "ak" "l"