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

Pau*_*yuk 57 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]+")
Run Code Online (Sandbox Code Playgroud)

这使

   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
Run Code Online (Sandbox Code Playgroud)

所以,第一个strsplit工作正常,但第二个提供了一个列表,每个都有两个元素,一个空字符串和我想要的结果,并将它们填充到dataframe列中.

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

rcs*_*rcs 100

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

R> sapply(df$suf, "[[", 2)
[1] "00" "01" "02" "00" "01" "02" "21" "01" "03"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这个例子中的 `"[["` 是做什么的? (3认同)
  • 选择列表项的单个元素,参见 ?"[[" (3认同)
  • @rcs 这太棒了,非常感谢!现在我有一个后续问题:如果每个列表项的第二个元素是一个列表,并且您想要获取它的第三个元素怎么办? (2认同)

小智 8

与purrr :: map这将是

df$suf %>%  map_chr(c(2)) 
Run Code Online (Sandbox Code Playgroud)

有关purrr :: map的更多信息