2010-05-10 217 views
46

我知道我之前遇到过这个问题,但此刻我有一点心理障碍。因为我找不到它,所以我会在这里发布,以便下次可以找到它。如何获得列表中每个元素的第二个子元素

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

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

回答

82

要选择各列表项的第二个元素:使用正则表达式

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) 
+0

什么是' “[[”'在这个例子中做什么? – user5359531 2017-09-26 23:04:18

+0

选择列表项中的单个元素,请参阅?“[[” – rcs 2017-09-27 08:01:36

4

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

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

这保证两列向量,但如果你的标签从关键不是它失败(即'AB01B')。

+0

RCS的答案实际上回答了我的主要问题(如何从列表中返回他的第二个值),但是您的答案似乎对于我实际需要的更优雅。做得好。 – PaulHurleyuk 2010-05-10 15:24:22

+1

你能否解释一下“[[”在sapply中工作过。有关sapply的定义请参见:http://www.inside-r.org/r-doc/base/sapply。 – and0rsk 2015-09-21 07:33:24

相关问题