我一直在努力了解如何strsplit更好地处理输出.我经常有这样的数据,我想分开:
mydata <- c("144/4/5", "154/2", "146/3/5", "142", "143/4", "DNB", "90")
#[1] "144/4/5" "154/2" "146/3/5" "142" "143/4" "DNB" "90"
Run Code Online (Sandbox Code Playgroud)
拆分后,结果如下:
strsplit(mydata, "/")
#[[1]]
#[1] "144" "4" "5"
#[[2]]
#[1] "154" "2"
#[[3]]
#[1] "146" "3" "5"
#[[4]]
#[1] "142"
#[[5]]
#[1] "143" "4"
#[[6]]
#[1] "DNB"
#[[7]]
#[1] "90"
Run Code Online (Sandbox Code Playgroud)
我从strsplit帮助指南中知道最终的空字符串不会产生.因此,根据要拆分的"/"数,我的每个结果中都会有1,2或3个元素
获得第一个元素非常简单:
sapply(strsplit(mydata, "/"), "[[", 1)
#[1] "144" "154" "146" "142" "143" "DNB" "90"
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何获得第2,第3 ......当每个结果中存在这些不等数量的元素时.
sapply(strsplit(mydata, "/"), "[[", 2)
# Error in FUN(X[[4L]], ...) : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)
我希望从一个有效的解决方案返回,如下:
#[1] "4" "2" "3" "NA" "4" "NA" "NA"
Run Code Online (Sandbox Code Playgroud)
这是一个相对较小的例子.我可以很容易地对这些数据做一些for循环,但是对于运行strsplit的1000个观察结果的真实数据以及由此产生的数十个元素,我希望找到更通用的解决方案.
(至少对于一维向量)[似乎NA在“i > length(x)”时返回,而[[返回错误。
x = runif(5)
x[6]
#[1] NA
x[[6]]
#Error in x[[6]] : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)
深入挖掘一下,do_subset_dflt(即[)调用ExtractSubset,我们注意到当想要的索引(“ii”)为“> length(x)”时NA返回(稍微修改一下以使其干净):
if(0 <= ii && ii < nx && ii != NA_INTEGER)
result[i] = x[ii];
else
result[i] = NA_INTEGER;
Run Code Online (Sandbox Code Playgroud)
另一方面do_subset2_dflt(即[[)如果想要的索引(“offset”)是“> length(x)”(稍微修改一下以使其干净),则返回错误:
if(offset < 0 || offset >= xlength(x)) {
if(offset < 0 && (isNewList(x)) ...
else errorcall(call, R_MSG_subs_o_b);
}
Run Code Online (Sandbox Code Playgroud)
在哪里#define R_MSG_subs_o_b _("subscript out of bounds")
(我不确定上面的代码片段,但根据它们的返回结果,它们似乎确实相关)