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.2012
、df.2.2012
、df.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
が一定である間、ループ内では)(参照。
私が何を意味しているか理解できない場合は、私に知らせてください。私は非常に具体的にしようとしました。
(リスト、関数(X){リターン(customSubset(X、 "青"、 "暗い"))})リスト内のすべてのデータ・フレームを入れて、 'lapplyを使用' – missuse
それは私にエラーを返しました: 'エラー:$演算子は原子ベクトルには無効です'。私は何を間違えたの? – Alexandros
df1がOPに投稿されたdata.frameであり、df2が同様のdata.frameであると仮定します: 'lapply(list(df1、df2)、function(x){return(customSubset(x、" BLUE "、" DARK ") )}) 'はうまくいくはずです。 – missuse