从strsplit-R之后的嵌套列表中提取第n个元素

jal*_*pic 7 r strsplit sapply

我一直在努力了解如何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个观察结果的真实数据以及由此产生的数十个元素,我希望找到更通用的解决方案.

ale*_*laz 4

(至少对于一维向量)[似乎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")

(我不确定上面的代码片段,但根据它们的返回结果,它们似乎确实相关)