2012-02-14 11 views
3

は、私は、次のデータフレームがあるとします。Rの列名に関するデータフレームをデータフレームのリストに分割する方法は?

df <- data.frame(BR.a=rnorm(10), BR.b=rnorm(10), BR.c=rnorm(10), 
USA.a=rnorm(10), USA.b = rnorm(10), FRA.a=rnorm(10), FRA.b=rnorm(10)) 

私はデータフレームのリストを作成したい、列名の最初の部分でそれらを分離、すなわち、「BR」で始まる列は一つの要素になります"USA"で始まる列は別の列になります。以下同様です。

カラム名を取得し、strsplitを使用してそれらを区切ることができます。しかし、私はそれを反復してデータフレームを分離する最良の方法がどのようになるのかよくわかりません。

strsplit(names(df), "\\.") 

は私のトップレベルの要素は、列と第二のレベルの名前は"."によって分割このsamesされているリストを与えます。

同じサブ文字列で始まる列のインデックス番号を取得するためにこのリストを反復することができます。これらの列を別のリストの要素としてグループ化しますか?

答えて

3

Dasonはそれに私を打つが、ここでは異なる同じ概念アプローチの味だ:「」私はこれらの正規表現は、まだあなたにある場合でも、右の結果を与えるべきだと思う

library(plyr) 

# Use regex to get the prefixes 
# Pulls any letters or digits ("\\w*") from the beginning of the string ("^") 
# to the first period ("\\.") into a group, then matches all the remaining 
# characters (".*"). Then replaces with the first group ("\\1" = "(\\w*)"). 
# In other words, it matches the whole string but replaces with only the prefix. 

prefixes <- unique(gsub(pattern = "^(\\w*)\\..*", 
         replace = "\\1", 
         x = names(df))) 

# Subset to the variables that match the prefix 
# Iterates over the prefixes and subsets based on the variable names that 
# match that prefix 
llply(prefixes, .fun = function(x){ 
    y <- subset(df, select = names(df)[grep(names(df), 
              pattern = paste("^", x, sep = ""))]) 
}) 

後の変数名に:

# Add a USA variable with "FRA" in it 
df2 <- data.frame(df, USA.FRANKLINS = rnorm(10)) 

prefixes2 <- unique(gsub(pattern = "^(\\w*)\\..*", 
         replace = "\\1", 
         x = names(df2))) 

llply(prefixes2, .fun = function(x){ 
    y <- subset(df2, select = names(df2)[grep(names(df2), 
              pattern = paste("^", x, sep = ""))]) 
}) 

unique(gsub(pattern = "^(\\w*)\\..*", 
      replace = "\\1", 
      x = c(names(df), "FRA.c.blahblah"))) 

またはプレフィックスは、変数名の後の表示された場合

3

これは、カラム名が常に(。 "に基づいて分割された)形式であり、最初の"。 "の前に識別子に基づいてグループ化する場合にのみ有効です。

df <- data.frame(BR.a=rnorm(10), BR.b=rnorm(10), BR.c=rnorm(10), 
USA.a=rnorm(10), USA.b = rnorm(10), FRA.a=rnorm(10), FRA.b=rnorm(10)) 

## Grab the component of the names we want 
nm <- do.call(rbind, strsplit(colnames(df), "\\."))[,1] 
## Create list with custom function using lapply 
datlist <- lapply(unique(nm), function(x){df[, nm == x]}) 
関連する問題