2017-11-29 8 views
1

特定の列が空であるかどうかに基づいて、データフレームの長いリスト内からデータフレームを選択しようとしています。データフレームのリストからデータフレームを選択する

この問題を解決するために作成したコードとともに、再現可能な例を示します。私は(ここでは、Cのためのb)は、別の許容可能な代替品として1つの確率変数を使用していますので、DF1 aは私が言って警告メッセージ取得の両方のグループ1とグループ2

d1 <- data.frame(a=rnorm(5), b=1:5, c=rnorm(5)) 
d2 <- data.frame(a=1:5, b=rnorm(5), c = c(NA, NA, NA, NA, NA)) 
d3 <- data.frame(a=1:5, b=c(NA, NA, NA, NA, NA), c=c(1:5)) 

my_test_data <- list(d1, d2, d3) 
group_1 <- list() 
group_2 <- list() 

for (i in 1:length(my_test_data)) { 
if(!is.nan(my_test_data[[i]]$b)) { 
group_1[i] <- my_test_data[i] 
} 
else if (!is.nan(my_test_data[[i]]$c)) { 
group_2[i] <- my_test_data[i] 
} 
else NULL 
} 

で終わる場合、私は気にしませ午前:

警告メッセージ: 1:(!is.nan(my_test_data [I]の$ B)){場合において: 条件が持つ長さ> 1と最初の要素のみが使用される

、グループ1とグループ2はmy_test_dataと同じです

すべての助力が大変感謝しています。

+0

'is.nan'または' is.na'試験全体ベクトルと列の同じ長さのベクトルを返す、例えば 'is.na(D2する$ C)' – h3rm4n

+0

の出力をチェックありがとうございます - このアプローチはうまくいかないでしょう。私はこれをどうやってやろうとしているのですか? –

答えて

2

サンプルコードでいくつかの問題が発生しています。

警告が表示されるのは、if条件がベクトルを返すためです。

is.nan(my_test_data[[3]]$b) 
[1] FALSE FALSE FALSE FALSE FALSE` 

2番目の問題は、サンプルデータにNaNという値がないことです。あなたはNAの値を持っています...だからis.nan()はとにかく何も見つかりません。

3番目の問題は、if/else if/elseが正しくフォーマットされていないことです。 else ifは、中括弧と同じ行になります。} else if() {

第4の問題は、それ自身では何もしません。あなたは何もしないので、else NULLを省略することもできます。あるいは、何かをするためにそれを変更することができます。

代わりの!is.na()を使用して、我々はあなたがリストにNULL値を格納しているためTRUE %in% is.na()

for (i in 1:length(my_test_data)) { 
    if(TRUE %in% is.na(my_test_data[[i]]$b)) { 
     group_1[i] <- my_test_data[i] 
    } else if (TRUE %in% is.na(my_test_data[[i]]$c)) { 
     group_2[i] <- my_test_data[i] 
    } # else { 
    # NULL 
    # } 
} 

今、あなたのコードは、まだいくつかの奇妙なリストを持っていますが、それはのために大丈夫だ場合、私はわからないかどうかを確認することができますあなたがしていること。

str(group_1) 

List of 3 
$ : NULL 
$ : NULL 
$ :'data.frame': 5 obs. of 3 variables: 
    ..$ a: int [1:5] 1 2 3 4 5 
    ..$ b: logi [1:5] NA NA NA NA NA 
    ..$ c: int [1:5] 1 2 3 4 5 
+0

TRUE/FALSEのベクトルを使うときの別のトリックは、 'sum()'コマンドです。たとえば、if(sum(is_type_data [[i]] $ b))> 0){do something} 'を実行することができます。このコマンドは、FALSEが常にゼロであり、すべてのゼロの合計がゼロであるため、いずれかの値が真であるかどうかをチェックします。 –

+0

時間をかけていただきありがとうございます。私は多くのことを学び、前のコードと比較しました。私はRを学び、野心的な分析をして自分自身を教えることを学んでいます - 大変感謝しています。 –

+0

@AdamSampson +1、OPが問題を抱えていた場所を説明してくれました。しかし、%is.na(..)の代わりに 'any(is.na(...))'を使うのはもっと慣れていると思います。 ) – duckmayr

関連する問題