Maë*_*aël 19 string r string-comparison
我有两个向量:
a = strsplit("po","")[[1]]
[1] "p" "o"
b = strsplit("polo","")[[1]]
[1] "p" "o" "l" "o"
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 来比较它们==
。不幸的是,a==b
给出了意想不到的结果。
a==b
[1] TRUE TRUE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
虽然我期望有:
[1] TRUE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
那么,是什么原因造成这种情况呢?怎样才能达到预期的效果呢?
该问题似乎与以下事实有关:两个向量的最后一个元素与更改b
为 egpolf
确实给出了预期结果相同,并且还因为设置b
为pooo
给出了TRUE TRUE FALSE TRUE
而不是TRUE TRUE TRUE TRUE
。
编辑
换句话说,我希望丢失的元素(当长度不同时)作为空值传递(似乎只""
给出TRUE TRUE FALSE FALSE
,NA
并NULL
给出不同的结果)。
c("p","o","","")==c("p","o","l","o")
[1] TRUE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
Dan*_*tor 19
您在这里遇到的问题是由于回收(而不是环保型)造成的。当对两个向量应用要求它们具有相同长度的运算时,R 通常会自动循环或重复较短的向量,直到它足够长以匹配较长的向量。您意想不到的结果是由于 R 将向量回收c("p", "o")
为长度 4(较大向量的长度)并将其本质上转换为c("p", "o", "p", "o")
. 如果我们进行比较c("p", "o", "p", "o")
,c("p", "o", "l", "o")
我们可以看到我们得到了上面意想不到的结果:
c("p", "o", "p", "o") == c("p", "o", "l", "o")
#> [1] TRUE TRUE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
我不太清楚为什么你会期望结果是TRUE TRUE FALSE FALSE
,因为将长度 2 向量与长度 4 向量进行比较,并回收长度 2 向量(这就是 R 正在做的事情)有点不明确)似乎是除了抛出错误之外最合理的默认值。
为了获得 OP 中显示的结果,我们可以将两个向量放入 a 中list
,将它们的length
s 调整为max
imum lengths
(通过添加NA's
)并测试比较是否为%in% TRUE
。
list(a, b) |>
(\(.) lapply(., `length<-`, max(lengths(.))))() |>
(\(.) do.call(\(x, y, ...) (x == y) %in% TRUE, .))()
# [1] TRUE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
笔记: R version 4.1.2 (2021-11-01)
数据:
a <- c("p", "o")
b <- c("p", "o", "l", "o")
Run Code Online (Sandbox Code Playgroud)