2013-08-29 33 views
1

是否可以通过仅指示所需条目的字符串来提取/子集数据框?R:子集/所需条目的子字符串索引对象

过滤条件存储在因子向量中。但只有前三位数字表示。这应该确定将从数据框开始的所有条目集合起来。

例子:

# Input dataframe 
data <- read.table(header=T, text=' 
      ID sex size 
     0120010 M 7 
     0120020 F 6 
     0121031 F 9 
     0130010 M 11 
     0130020 M 11 
     0130030 F 14 
     0130040 M 11 
     0150030 F 11 
     0150110 F 12 
     0180030 F 9 
     1150110 F 12 
     9180030 F 9 
     'colClasses =c("character", "factor", "integer")) 

# Input vector/factor with the ID chunk, containing only the fist three digits 
# of the targeted entries in data$ID 
IDfilter <- c("012", "015", "115") 

# My try/idea which sadly is not working - PLEASE HELP HERE 
subset <- data[ID %in% paste(IDfilter, "?.", sep=""),] 

# Expected subset 
> subset 
      ID sex size 
1 0120010 M 7 
2 0120020 F 6 
3 0121031 F 9 
4 0150030 F 11 
5 0150110 F 12 
6 1150110 F 12 

谢谢! :)

回答

2

这样的事情?

data <- read.table(header=T, text=' 
      ID sex size 
     0120010 M 7 
     0120020 F 6 
     0121031 F 9 
     0130010 M 11 
     0130020 M 11 
     0130030 F 14 
     0130040 M 11 
     0150030 F 11 
     0150110 F 12 
     0180030 F 9 
     1150110 F 12 
     9180030 F 9 
     ', colClasses =c("character", "factor", "integer")) 

IDfilter <- c("012", "015", "115") # filter must be character vector 



    data[substr(data[,"ID"], 1,3) %in% IDfilter, ] 
#  ID sex size 
#1 0120010 M 7 
#2 0120020 F 6 
#3 0121031 F 9 
#8 0150030 F 11 
#9 0150110 F 12 
#11 1150110 F 12 

请注意colClases。在这种情况下,ID被假设是为了允许字符的第一个数字为0,如0120010否则(如果是数字或整数)此数目将是120010

另一个替代方案是

data[substr(data[,"ID"], 1,nchar(IDfilter)[1]) %in% IDfilter, ] 

其中substr的第三个参数自动更新为IDfileter中第一个元素的字符数,此处的假设是IDfilter中的每个数字都具有相同数量的字符。

+0

@Jilber很好! :) 谢谢! “as.numeric”部分重要吗?在我原来的问题中,我也有领先的零。 – alex

+0

我编辑了我的答案,以说明引导零时存在的情况。在这种情况下,'ID'假设为'字符',以便允许第一个数字为'02002'中的'0',否则(如果是数字或整数)该数字将是'2002'。 –

+1

非常感谢!它完美的工作! :) – alex

2

一个正则表达式的方法:

subset(data, grepl(paste0("^",IDfilter,collapse="|"), ID)) 

     ID sex size 
1 0120010 M 7 
2 0120020 F 6 
3 0121031 F 9 
8 0150030 F 11 
9 0150110 F 12 
11 1150110 F 12 

注: “^” 是相匹配的字符串的开头。我假设你的过滤器中只有数字。

+0

谢谢!非常好! :) – alex