我希望在完成以下任务后找到任何字词的中点:
>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"一起作为中点。
答案 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"