2013-08-29 75 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