【问题标题】:How to get the second sub element of every element in a list如何在列表中获取每个元素的第二个子元素
【发布时间】:2011-02-17 17:00:54
【问题描述】:

我知道我以前遇到过这个问题,但我现在有点精神障碍。由于在 SO 上找不到,所以我会在这里发布,以便下次找到。

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

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

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

【问题讨论】:

    标签: r


    【解决方案1】:

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

    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)
    

    【讨论】:

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

    使用 purrr::map 这将是

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

    for further info on purrr::map

    【讨论】:

    • 不错! c(2)有点多余,所以可以简化为map_chr(2)
    【解决方案3】:

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

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

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

    【讨论】:

    • RCS 的回答实际上回答了我的主要问题(如何从列表中返回第二个值),但您的回答似乎更适合我真正想要的。干得好。
    • 您能否解释一下“[[”在 sapply 中是如何工作的。 sapply 的定义在:inside-r.org/r-doc/base/sapply.
    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多