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

时间:2010-05-10 14:37:26

标签: r

我知道我之前遇到过这个问题,但此刻我有一点精神障碍。因为我在SO上找不到它,我会在这里发布,所以我可以在下次找到它。

我有一个包含表示ID标签的字段的数据框。此标签有两个部分,alpha前缀和数字后缀。我想将它拆开并创建两个具有这些值的新字段。

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, "[A-Z]+")

哪个给出了

   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工作正常,但第二个提供了一个列表,每个列表都有两个元素,一个空字符串和我想要的结果,并将它们填充到dataframe列中。

如何从列表的每个元素中选择第二个子元素? (或者,有更好的方法可以做到这一点)

3 个答案:

答案 0 :(得分:97)

选择每个列表项的第二个元素:

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

使用正则表达式的替代方法:

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

答案 1 :(得分:5)

使用purrr :: map这将是

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

for further info on purrr::map

答案 2 :(得分:4)

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

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

这保证两列都是向量,但如果您的标签不是来自密钥(即'AB01B'),则会失败。

相关问题