基于来自另一个的特定数字间隔子集一个数据帧

use*_*870 3 syntax r subset

我想df1基于超出特定数字区间的值的子集df2.

我的意见df1df2:

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)
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下代码将其子集化但未成功:

out <- df1[if(df2 >= 0.90) |if(df2 <= 0.10) | if(df2 <= 0.60 && df2 >= 0.40)]
Run Code Online (Sandbox Code Playgroud)

我试图仅将df1具有高于0.90 低于0.1 0.4到0.6之间的值的单元进行子集(反之:NA到x间隔:0.40> x> 0.10和0.9> x> 0.6).预期的产出是:

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)
Run Code Online (Sandbox Code Playgroud)

我将非常感谢这里的语法帮助.

ali*_*ire 5

手动引入NAs 通常更容易.if如果没有代码可以评估,如果它是真的,你不需要; 不等式已经评估为布尔值.真的,你需要的只是

 df1[((df2 < 0.9) & (df2 > 0.6)) | ((df2 < 0.4) & (df2 > 0.1))] <- NA
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

使用这样的长布尔测试,请注意括号,特别是如果您有多个范围.


编辑

如果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
Run Code Online (Sandbox Code Playgroud)

因为df2$name是一个因素.因为因子将它们的值存储为数字(映射到级别),所以R警告它不会对这些值执行不等式运算,无论如何我们不希望这样做.由于它对name列没有任何作用,因此无论警告如何,结果都是我们想要的结果.

通过改变name角色,或者不首先将其变成一个因素,可以完全避免警告.stringsAsFactors = FALSEread.table读入数据时指定选项,或者在上面添加前一行

 df2$name <- as.character(df2$name)
Run Code Online (Sandbox Code Playgroud)

由于很明显R不会将字符串和数字与不等式进行比较,因此不再提出警告.