2014-02-07 17 views
1

我有以下的數據幀:如何字符向量變換到正則表達式數據幀索引

df<- structure(list(ID = c(9000099L, 9000296L, 9000622L, 9000798L, 
9001104L, 9001400L), VERSION = structure(c(1L, 1L, 1L, 1L, 1L, 
1L), .Label = "1.2.1", class = "factor"), V01SF1 = c(1L, 2L, 
2L, 3L, 2L, 1L), V01SF2 = c(3L, 3L, 3L, 3L, 3L, 3L), V01BD1 = c(2L, 
3L, 3L, 2L, 3L, 3L), V01BD2 = c(5L, 5L, 5L, 3L, 5L, 5L)), .Names = c("ID", 
"VERSION", "V01SF1", "V01SF2", "V01BD1", "V01BD2"), row.names = c(NA, 
6L), class = "data.frame") 

    > df 
     ID VERSION V01SF1 V01SF2 V01BD1 V01BD2 
1 9000099 1.2.1  1  3  2  5 
2 9000296 1.2.1  2  3  3  5 
3 9000622 1.2.1  2  3  3  5 
4 9000798 1.2.1  3  3  2  3 
5 9001104 1.2.1  2  3  3  5 
6 9001400 1.2.1  1  3  3  5 

我想索引該數據幀與「版本」列和含有SF和DF在他們的名字列。我有一個載體,我想在DF名稱作爲使用的模式搜索的元素:

vars<- c ("SF", "DF") 

我對版本進行索引很容易:

df [grep ("SION", names (df), value =T)] 


    VERSION 
    1 1.2.1 
    2 1.2.1 
    3 1.2.1 
    4 1.2.1 
    5 1.2.1 
    6 1.2.1 

我如何添加從矢量grep ("SION", names (df), value =T)元素作爲grep模式的vars<- c ("SF", "DF")? 生成的代碼應爲df [grep ("SION|SF|BD", names (df), value =T)]工作給予以下的輸出:

VERSION V01SF1 V01SF2 V01BD1 V01BD2 
1 1.2.1  1  3  2  5 
2 1.2.1  2  3  3  5 
3 1.2.1  2  3  3  5 
4 1.2.1  3  3  2  3 
5 1.2.1  2  3  3  5 
6 1.2.1  1  3  3  5 

非常感謝您

回答

2

像這樣:

vars <- c("SF","BD") 
vars 
#[1] "SF" "BD" 

df[grepl(paste(c("SION",vars),collapse="|"),names(df))] 

# VERSION V01SF1 V01SF2 V01BD1 V01BD2 
#1 1.2.1  1  3  2  5 
#2 1.2.1  2  3  3  5 
#3 1.2.1  2  3  3  5 
#4 1.2.1  3  3  2  3 
#5 1.2.1  2  3  3  5 
#6 1.2.1  1  3  3  5 
+0

使用'grepl()'將使該代碼更加簡潔。 – hadley

+0

'grepl'幾乎總是索引的正確答案。 –

1

首先定義s爲:

s <- c("SION", vars) 

現在嘗試:

g <- sapply(s, grepl, names(df)) 
df[ apply(g, 1, any) ] 

df[ unlist(sapply(s, grep, names(df))) ] 

​​

pat <- paste(s, collapse = "|") 
df[ grepl(pat, names(df)) ] 
3

嘗試這種情況:

vars<- c ("SF", "BD") 
version = "VERSION" 

pattern = paste(c(version, vars), collapse="|") 

> pattern 
[1] "VERSION|SF|BD" 

ind = grep(pattern, names(df), value=TRUE) 

> ind 
[1] "VERSION" "V01SF1" "V01SF2" "V01BD1" "V01BD2" 

訣竅來自grep的第一個參數只是一個包含正則表達式的字符向量。所以,你可以正確地使用paste來構建你的常規表達式。現在你可以索引你的data.frame。

dfx = df[, ind] 


> dfx 
    VERSION V01SF1 V01SF2 V01BD1 V01BD2 
1 1.2.1  1  3  2  5 
2 1.2.1  2  3  3  5 
3 1.2.1  2  3  3  5 
4 1.2.1  3  3  2  3 
5 1.2.1  2  3  3  5 
6 1.2.1  1  3  3  5 
+0

非常感謝,thelatemail,G.GTothendieck和Ricardo Oliveros-Ramos! – DSSS