2017-10-30 6 views
1

subset(またはsubsetに基づくカスタム関数)と共にapply関数を使用する方法を見つけようとしています。私はすでに質問されている同様の質問を知っている、私は少し具体的です。私は、複数の変数に基づいて複数のデータセットの特定の部分をサブセット化する必要があります。私は、データフレーム構造のカップル「タイプ」を持って、そのうちの一つは、このようになります。サブセット関数(またはサブセットに基づくカスタム関数)で適用

colour shade value 
RED LIGHT -1.05 
RED LIGHT -1.37 
RED LIGHT -0.32 
RED LIGHT 0.87 
RED LIGHT -0.2 
RED DARK 0.52 
RED DARK -0.2 
RED DARK 0.64 
RED DARK 1.12 
RED DARK 4 
BLUE LIGHT 0.93 
BLUE LIGHT 0.78 
BLUE LIGHT -1.84 
BLUE LIGHT -0.5 
BLUE LIGHT -1.11 
BLUE DARK -4.86 
BLUE DARK 1.11 
BLUE DARK 0.14 
BLUE DARK 0.12 
BLUE DARK -1.65 
GREEN LIGHT  3.13 
GREEN LIGHT 2.65 
GREEN LIGHT -2.36 
GREEN LIGHT -3.11 
GREEN LIGHT 3.49 
GREEN DARK 1.91 
GREEN DARK -1.1 
GREEN DARK -1.93 
GREEN DARK 1 
GREEN DARK -0.23 

私はそれらの多くを持っています。彼らの名前は、私はそれに基づいてsubsetまたはカスタム関数を使用する必要がありますこれに基づき

list.dfs.names=df1,df2,df3

に格納されています。

私が言ったように私が持っているので、私はこのようなカスタム関数を使用し

customSubset=function(df,col,shade){subset(df,df$colour %in% col & df$shade %in% shade)}

いくつかのタイプのdf構造体があり、私の仕事は少し速くなります。それは次のように機能します。

example=customSubset(df1,"BLUE","DARK")

、出力は次のようになります。今まで私はforループを使用していた

colour shade value 
11 BLUE LIGHT 0.93 
12 BLUE LIGHT 0.78 
13 BLUE LIGHT -1.84 
14 BLUE LIGHT -0.50 
15 BLUE LIGHT -1.11 
16 BLUE DARK -4.86 
17 BLUE DARK 1.11 
18 BLUE DARK 0.14 
19 BLUE DARK 0.12 
20 BLUE DARK -1.65 

が、私はどこのネスト特に、より便利であるように思われapplyに私のアプローチを変更したいですループが必要です。だから私疲れ:なし成功と

lapply(customSubset(list.dfs.names, "BLUE","DARK"))

lapply(list.dfs.names, customSubset("BLUE","DARK"))

。誰もこの問題に少し手を差し伸べてもらえませんでしたか、私は明確に理解していると思いますapplyループが動作します。しかし、私はかなりforメソッドに精通しているので、相違についての追加の説明は理解されるでしょう。

customSubsetで普通のsubsetを使用するか、上記のexampleと同じ結果を返す他の方法を使用できない場合は、

は、事前に

EDITありがとう:ここで例にdfを同様の生成するコードがある私は投稿:

`data.frame("colour"=(c(rep("RED",10),rep("BLUE",10),rep("GREEN",10))) 
      ,"shade"=c(rep(c(rep("LIGHT",5),rep("DARK",5)),3)) 
      , runif(30,min=0,max=1))` 

EDIT2:要求されたとして、私は私のyear問題でそれを展開する私のポストを編集していますが。私のdfsは、次のように異なる年(それぞれ複数)から来ます:df.1.2012df.2.2012df.1.2011など。主な問題は、すべてのdfsで同じ年を参照する必要はないということです(代わりに非常に簡単です)。代わりに、特定の地平線(例:year+2またはyear-1)に基づいてデータをサブセット化する必要があります。私は希望の年のリストを作成しました(year+2の例ではlist.year=c(2014,2014,2013))、これは私のdfsのリストとペアになっていました(それはfor loopと一緒に働いた方法です)。

私はapplyのアプローチについて同様の方法を見つける必要があります。次に例を示します。

set.seed(200) 

df_2014=data.frame(colour=(c(rep("RED",10),rep("BLUE",10),rep("GREEN",10))) 
      ,shade=c(rep(c(rep("LIGHT",5),rep("DARK",5)),3)) 
      ,year=c(rep(2011:2015,6)) 
      ,value=runif(30,min=0,max=1)) 

df_2013=data.frame(colour=(c(rep("RED",10),rep("BLUE",10),rep("GREEN",10))) 
      ,shade=c(rep(c(rep("LIGHT",5),rep("DARK",5)),3)) 
      ,year=c(rep(2011:2015,6)) 
      ,value=runif(30,min=0,max=1)) 
horizon=+1 

subset(df_2014, df_2014$colour %in% "BLUE" & df_2014$shade %in% "DARK" & df_2014$year %in% c(2014+horizon)) 
subset(df_2013, df_2013$colour %in% "BLUE" & df_2013$shade %in% "DARK" & df_2013$year %in% c(2013+horizon)) 

だから私は数年でカラムを追加し、私は(そうyear+1がここ2014+1だろう)年後yearと命名DFSそれを呼びました。地平線は自明です。結果は次のとおりです。

#df_2014 
     colour shade year value 
20 BLUE DARK 2015 0.6463296 

#df_2013 

    colour shade year  value 
20 BLUE DARK 2015 0.6532767 

私は、前の例のように、この編集list.df=list(df_2014,df_2013)で(データフレームのリストにapply機能を使用する必要があるが、今回は1人のDFにすべての結果サブセット条件year+horizon(および可能プットを追加しますが、これはありますここにはいない主な問題)結論として

:あなたはyear+horizonにこの部分の両方で私のsubset機能を見て、yearは、リストからのDF(に基づいて変更することがあります)horizonが一定である間、ループ内では)(参照。

私が何を意味しているか理解できない場合は、私に知らせてください。私は非常に具体的にしようとしました。

+0

(リスト、関数(X){リターン(customSubset(X、 "青"、 "暗い"))})リスト内のすべてのデータ・フレームを入れて、 'lapplyを使用' – missuse

+0

それは私にエラーを返しました: 'エラー:$演算子は原子ベクトルには無効です'。私は何を間違えたの? – Alexandros

+1

df1がOPに投稿されたdata.frameであり、df2が同様のdata.frameであると仮定します: 'lapply(list(df1、df2)、function(x){return(customSubset(x、" BLUE "、" DARK ") )}) 'はうまくいくはずです。 – missuse

答えて

2

問題は、あなたは、その最初の引数、dfの環境での論理式を評価している、subsetを使用して、df$shade %in% shadeをやっている構造

subset(df,df$colour %in% col & df$shade %in% shade) 

のようです。 dfが最初の引数であるため、これはshade %in% shadeに相当します。あなたは別の名前を使用するトリックを行うには、次のように関数を書き直す必要があります。

customSubset <- function(DF, COL, SHADE){ 
    subset(DF, colour %in% COL & shade %in% SHADE) 
} 

これですべてが正常に動作します。

set.seed(5601) # make the results reproducible 

df1 <- data.frame(colour = sample(c("RED", "GREEN", "BLUE"), 30, TRUE), 
        shade = sample(c("LIGHT", "DARK"), 30, TRUE), 
        value = rnorm(30, sd = 9)) 
df2 <- data.frame(colour = c(rep("RED",10), rep("BLUE",10), rep("GREEN",10)) 
      ,shade=c(rep(c(rep("LIGHT",5),rep("DARK",5)), 3)) 
      , value = runif(30,min=0,max=1)) 

list.dfs <- list(df1, df2) 

customSubset(df1,"BLUE","DARK") 
# colour shade  value 
#5 BLUE DARK 4.288107 
#6 BLUE DARK 2.860724 
#8 BLUE DARK -10.720379 
#10 BLUE DARK -15.407090 
#14 BLUE DARK -2.259848 
#30 BLUE DARK -18.364494 

# apply the function to all df's in the list 
# both forms are equivalent 
lapply(list.dfs, function(x) customSubset(x, "BLUE", "DARK")) 
lapply(list.dfs, customSubset, "BLUE", "DARK") 
+0

ありがとう、私は元のコードに適用している間、私は1つの簡単な問題があります:変数の1つは、数値です(より具体的に年)。だから私はあなたのコード 'lapply(list.dfs、customSubset、" BLUE "、" DARK ")のうちの1つを使ってこの' list.year = c(2015,2015,2016,2016) '(4つのdfs) 。年[私]) '。 'for'メソッドと同様に' [i] 'を使用しました。これは、各dfとサブセットのデータに年(または複数年)を割り当てることを意味します。これは 'apply'アプローチでどのように動作しますか? – Alexandros

+0

今質問は異なっています。関数 'customSubset'には余分な引数' year'があります。質問を編集して、期待される出力の例を教えてください。 –

+0

私の投稿を編集しました。何かが不明な場合は教えてください。 – Alexandros

関連する問題