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

Subset one data frame based on specific numeric intervals from another          3 問題

<コード> 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)]

です <事前> <コード> <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  ベストアンサー

<事前> <コード> 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

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

編集

<事前> <コード> 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 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 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) ]   "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]]  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 )

160  データをフィルタリングします.RAME行の論理条件によって  ( Filter data frame rows by a logical condition )

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 )

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  データフレームの各列をフィルタリングすると、比類のない値の場合はNA  ( Filtering each column of a data frame an put na for unmatched values )

4  配列が他の配列のサブセットであるかどうかを確認します。ジャワー  ( Checking if array is subset of other array java )