別の数値間隔に基づく1つのデータフレームをサブセット -- r フィールド と syntax フィールド と subset フィールド 関連 問題

Subset one data frame based on specific numeric intervals from another












3
vote

問題

日本語

<コード> df2 の特定の数値間隔の外側の値に基づいて、サブセット<コード> df1 。

マイ入力<コード> df1 および<コード> df2 :

<事前> <コード> df1 <- 'name sam1 sam2 sam3 AZ1 2.65 2.56 2.65 AX1 2.22 2.41 2.85 AX2 2.45 2.45 2.85' df1 <- read.table(text=df1, header=T) df2 <- 'name sam1 sam2 sam3 AZ1 1 0 1 AX1 0.75 0.55 1 AX2 0 0 0.62' df2 <- read.table(text=df2, header=T)

私は成功せずにそれをサブセットするために以下のコードを試しました:

<事前> <コード> out <- df1[if(df2 >= 0.90) |if(df2 <= 0.10) | if(df2 <= 0.60 && df2 >= 0.40)]

私は0.90 または未満の値を有する df1 セルだけを0.4から0.6(他のもの)の間でサブセットしようとしていた。 <コード> <h1>Chart as img</h1> <img id="foobar" src="" /> <h1>Original Canvas</h1> <canvas id="myChart" width="300" height="300"></canvas> 0 の間隔:0.40と0.9> 0.6)。予想される出力は:

です <事前> <コード> <h1>Chart as img</h1> <img id="foobar" src="" /> <h1>Original Canvas</h1> <canvas id="myChart" width="300" height="300"></canvas> 1

私はここでの構文の助けに苦しんでいるでしょう。

英語

I would like subset df1 based on values which are outside specific numeric intervals in df2.

My input df1 and df2:

df1 <- 'name sam1 sam2 sam3           AZ1  2.65  2.56  2.65         AX1  2.22  2.41  2.85         AX2  2.45  2.45  2.85' df1 <- read.table(text=df1, header=T)  df2 <- 'name sam1 sam2 sam3           AZ1  1  0  1         AX1  0.75  0.55  1         AX2  0  0  0.62' df2 <- read.table(text=df2, header=T) 

I tried the below code to subset it without success:

out <- df1[if(df2 >= 0.90) |if(df2 <= 0.10) | if(df2 <= 0.60 && df2 >= 0.40)] 

Where I was trying to subset just the df1 cells which has values above 0.90 or below 0.1 or between 0.4 to 0.6 (the other way around: NA to the x intervals: 0.40 > x > 0.10 and 0.9 > x > 0.6). The expected output is:

out <- 'name sam1 sam2 sam3               AZ1  2.65  2.56  2.65             AX1  NA  2.41  2.85             AX2  2.45  2.45  NA' out <- read.table(text=out, header=T) 

I would be grateful for any help with the syntax here.

</div
        

回答リスト

5
 
vote
vote
ベストアンサー
 

通常、 NA sを手動で導入する方が簡単です。 if は、それが正しい場合に評価されるコードがない場合は必要ありません。不等式はすでにブール値に評価されています。本当に、あなたが必要とするのは

<事前> <コード> df1[((df2 < 0.9) & (df2 > 0.6)) | ((df2 < 0.4) & (df2 > 0.1))] <- NA

<コード> df1 を変更する

<事前> <コード> > df1 name sam1 sam2 sam3 1 AZ1 2.65 2.56 2.65 2 AX1 NA 2.41 2.85 3 AX2 2.45 2.45 NA

このような長いブールテストでは、特に複数の範囲を持っている場合は、括弧を見てください。


編集

上記のように df2 で呼び出された場合、このコードは警告を発生させます

<事前> <コード> Warning messages: 1: In Ops.factor(left, right) : ‘<’ not meaningful for factors 2: In Ops.factor(left, right) : ‘>’ not meaningful for factors 3: In Ops.factor(left, right) : ‘<’ not meaningful for factors 4: In Ops.factor(left, right) : ‘>’ not meaningful for factors

<コード> df2$name は要因です。要因はそれらの値を数字として(レベルにマッピングされています)、Rはそれらの値に対して不等式操作を実行していないことを警告しています。 name 欄には何もないので、警告に関係なく私たちが望んでいるの結果です。

警告は、を文字に変更したり、そもそも要因に変えたりしないことによって、全体を回避できます。データ内で読み込んだとき、または上記の行を

で上記の行を追加するときは、 if1 のオプション if0 を指定してください。 <事前> <コード> if2

Rが文字列と数字を不平等と比較しないことは明らかであるので、警告を上げなくなります。

 

It's usually easier to manually introduce NAs. You don't need if if there's no code to be evaluated if it's true; inequalities already evaluate to a Boolean. Really, all you need is

 df1[((df2 < 0.9) & (df2 > 0.6)) | ((df2 < 0.4) & (df2 > 0.1))] <- NA 

which changes df1 so it looks like

> df1   name sam1 sam2 sam3 1  AZ1 2.65 2.56 2.65 2  AX1   NA 2.41 2.85 3  AX2 2.45 2.45   NA 

With long Boolean tests like this, watch your parentheses, especially if you've got multiple ranges.


Edit

If called on the df2 exactly as above, this code will raise warnings

Warning messages: 1: In Ops.factor(left, right) : ‘<’ not meaningful for factors 2: In Ops.factor(left, right) : ‘>’ not meaningful for factors 3: In Ops.factor(left, right) : ‘<’ not meaningful for factors 4: In Ops.factor(left, right) : ‘>’ not meaningful for factors 

because df2$name is a factor. Since factors store their values as numbers (mapped to levels), R is warning that it's not performing the inequality operations on those values, which we don't want it to do, anyway. Since it does nothing to the name column, the result it what we want regardless of the warnings.

The warnings can be avoided wholly by changing name to character, or not turning it into a factor in the first place. Either specify the option stringsAsFactors = FALSE in read.table when you read in the data, or prepend the above line with

 df2$name <- as.character(df2$name) 

Since it's obvious that R won't compare a string and a number with an inequality, it will no longer raise warnings.

</div
 
 
   
   
1
 
vote
if3 ライブラリで

<事前> <コード> if4

または短いが同じ回答

<事前> <コード> if5

 

With the magrittr library

library(magrittr)  idx <- as.matrix(df2[, -1]) %>%         {(.<0.9 & .>0.6) | (.<0.4 & .>0.1)}  df1[, -1][idx] <- NA  df1     name sam1 sam2 sam3 1  AZ1 2.65 2.56 2.65 2  AX1   NA 2.41 2.85 3  AX2 2.45 2.45   NA 

Or a shorter but the same answer

df1[, -1][df2 %>% .[, -1] %>% as.matrix %>%           {(.<0.9 & .>0.6) | (.<0.4 & .>0.1)}] <- NA 
</div
 
 
1
 
vote

FindIntervalを使用してDF2の値とコンジションの間隔をマッピングする論理行列を返す関数を作成してから、 Warning messages: 1: In Ops.factor(left, right) : ‘<’ not meaningful for factors 2: In Ops.factor(left, right) : ‘>’ not meaningful for factors 3: In Ops.factor(left, right) : ‘<’ not meaningful for factors 4: In Ops.factor(left, right) : ‘>’ not meaningful for factors 66666666666666661

でNAをターゲットデータフレームにスタンプすることができます。 <事前> <コード> if7

DF1:

から値を抽出するためにその関数を使用することもできます。 <事前> <コード> if8

抽出のプロセスはマトリックスに強制的になり、すべての文字を強制するためのものです。そのため、わずかに異なる操作を試します。

<事前> <コード> if9
 

You can make a function that returns a logical matrix that maps the from the values of df2 and the condtioning intervals using findInterval and then stamps the NA's onto the target dataframe with is.na<-

 nafunc <- function(z) {sapply(z, function(x)        findInterval( as.numeric(x), c(-Inf, 0.10, 0.40, 0.6, 0.9, Inf)) %in% c(2, 4) )}  is.na( df1)  <- nafunc(df2) df1 #------       name sam1 sam2 sam3 1  AZ1 2.65 2.56 2.65 2  AX1   NA 2.41 2.85 3  AX2 2.45 2.45   NA 

You could also use that function to extract the values from the df1:

> df1[ !nafunc(df2) ]  [1] "AZ1"  "AX1"  "AX2"  "2.65" "2.45" "2.56" "2.41" "2.45" "2.65" "2.85" 

Unbeautiful, since the process of extraction coerces to a matrix, coercing everything to character. So will try a slightly different sequence of operations:

> df1[, 2:4 ][!nafunc(df2)[, 2:4]] [1] 2.65 2.45 2.56 2.41 2.45 2.65 2.85   # Delivers the first requested result. 
</div
 
 

関連する質問

1  Data.tableファイルのより効率的なループを作成します  ( Make a more efficient loop in data table file ) 
現在のデータをループでサブセットしようとしています。プロセスは非常に遅いです。これがサブセット化前のデータサンプルです。 <事前> <コード> # V1 V2 V3 type #1: 1 362.25 361.75 ...

160  データをフィルタリングします.RAME行の論理条件によって  ( Filter data frame rows by a logical condition ) 
論理条件に基づいて、 data.frame から行をフィルタリングしたいです。 のようなデータフレームがあるとしましょう。 <事前> <コード> expr_value cell_type 1 5.345618 bj fibroblast 2...

1  データフレームから特定の値を削除するには、どのようにして特定の値を削除できますか?  ( How can i use indeces to remove specific values from a dataframe ) 
998877611 関数を使用して、9変数データフレームの変数 lockObject2 のどの値が1024以上であるかを教えるインデックスを生成し、 variable lockObject3 は768を超えています。 template<cla...

0  線分に基づいて一連のポイントをサブセットに分割する  ( Splitting a set of points into subsets based on line segments ) 
ポイントと一連の線分を持っています。これらの線分に基づいて、一連のポイントをサブセットまたはクラスタに分割したいと思います。最終的には、各サブセット(右側の図に示すオレンジ色の多角形)ごとに凸の船体を探しています。以下の例の線分は互いに接続されていますが、これ...

0  特定の値を含むセルのみを保持します  ( Keep only the cells that contain certain value ) 
私は、さまざまな診断コードを含む25列の16000以上の行を持つデータセット「ケース」を持っています。 56個の固有の診断コードを含むキーを持っています。キーの中のものと一致するコードを解析する必要があります。これをより簡潔なデータセットに集めることができます...

0  他のテーブルから小計に基づいてフィールドを更新します  ( Update a field based on subtotal from another table ) 
Oracle(10)を使用しています。 次の2つのテーブルを持っています: <事前> <コード> Table1 (uniq rows): ID AMOUNT DATE Table2: ID AMOUNT1 AMOUNT2 ...AMO...

1  VECのデータをサブセット化する  ( Subsetting data with a vec ) 
データフレームをベクトルでサブセットしたいが、ベクトルの各値のサブセットを複製したい。 <事前> <コード> data = data.frame(A = c(1,2,3,1), B = c(1,2,3,4)) vec = c(1, 1, 1) subset(d...

46  特定の値に合計するすべてのサブセットを見つけます  ( Find all subsets that sum to a particular value ) 
数字のセットを考える:{1,3,2,5,4,9}、特定の値(この例では9)に合計するサブセットの数を見つけます。 これは、セットが9に合計されたサブセットを持っているかどうかを確認するのではなく、わずかな違いがあるサブセット合計の問題と似ています。そのようなサ...

1  データフレームの各列をフィルタリングすると、比類のない値の場合はNA  ( Filtering each column of a data frame an put na for unmatched values ) 
私は以下のような表を持っています: <事前> <コード> [,1] [,2] [,3] [,4] [,5] [1,] a A 0.06 0.31 -1.5 [2,] b B -0.75 0.2 ...

4  配列が他の配列のサブセットであるかどうかを確認します。ジャワー  ( Checking if array is subset of other array java ) 
私は100個の数字を配列してから、最初の20をランダムにシャッフルして2つの異なるアレイを持つようにしてください。 AとB。 この割り当ての場合、アレイAからの最初の20個の数字が最初の20個の数字AF配列Bのサブセットであることを確認する必要がある。 今まで...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有