如何获取列表中每个元素的第二个子元素

我知道我之前遇到过这个问题,但是我现在有一点心理障碍。 因为我找不到它,所以我会在这里张贴,所以我可以find下一次。

我有一个数据框,其中包含代表一个ID标签的字段。 这个标签有两个部分,一个字母前缀和一个数字后缀。 我想分开它并创build两个新的字段与这些值中。

structure(list(lab = c("N00", "N01", "N02", "B00", "B01", "B02", "Z21", "BA01", "NA03")), .Names = "lab", row.names = c(NA, -9L ), class = "data.frame") df$pre<-strsplit(df$lab, "[0-9]+") df$suf<-strsplit(df$lab, "[AZ]+") 

这使

  lab pre suf 1 N00 N , 00 2 N01 N , 01 3 N02 N , 02 4 B00 B , 00 5 B01 B , 01 6 B02 B , 02 7 Z21 Z , 21 8 BA01 BA , 01 9 NA03 NA , 03 

所以,第一个strsplit工作正常,但第二个给出了一个列表,每个列表有两个元素,一个空string和我想要的结果,并将它们填充到dataframe列中。

我如何从列表的每个元素中select第二个子元素? (或者,有没有更好的方法来做到这一点)

要select每个列表项目的第二个元素:

 R> sapply(df$suf, "[[", 2) [1] "00" "01" "02" "00" "01" "02" "21" "01" "03" 

另一种使用正则expression式的方法:

 df$pre <- sub("^([AZ]+)[0-9]+", "\\1", df$lab) df$suf <- sub("^[AZ]+([0-9]+)", "\\1", df$lab) 

首先:如果你使用str(df)你会看到df$prelist 。 我想你想要vector (但我可能是错的)。
返回到问题 – 在这种情况下,我将使用gsub

 df$pre <- gsub("[0-9]", "", df$lab) df$suf <- gsub("[AZ]", "", df$lab) 

这保证了两列都是向量,但是如果你的标签不是从关键字(例如'AB01B' )就会失败。

与purrr ::地图这将是

 df$suf %>% map_chr(c(2)) 

欲了解更多关于purrr :: map的信息