R 根据一个数据帧与另一个数据帧之间的特定数值间隔对一个数据帧进行子集划分

R 根据一个数据帧与另一个数据帧之间的特定数值间隔对一个数据帧进行子集划分,r,syntax,subset,R,Syntax,Subset,我希望子集df1基于df2中特定数值间隔之外的值 我的输入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

我希望子集
df1
基于
df2
中特定数值间隔之外的值

我的输入
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)

如果您能在这里提供语法方面的帮助,我将不胜感激。

手动引入
NA
s通常更容易。如果没有要评估的代码,则不需要
,如果它是真的;不等式已计算为布尔值。真的,你只需要

 df1[((df2 < 0.9) & (df2 > 0.6)) | ((df2 < 0.4) & (df2 > 0.1))] <- NA
对于这样的长布尔测试,请注意括号,特别是如果有多个范围


编辑 如果完全按照上述方式调用
df2
,此代码将引发警告


因为很明显R不会用不等式来比较字符串和数字,它将不再发出警告。

您可以创建一个函数,该函数返回一个逻辑矩阵,该矩阵使用findInterval从df2的值和条件间隔映射,然后使用
is.NA使用
magrittr
库将NA标记到目标数据帧上

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
库(magrittr)
idx%
{(.0.6) | (.0.1)}
df1[,-1][idx].-,-1]>%as.matrix%>%

{(.0.6)|(.0.1)}]右侧,用于
name
列。您可以围绕它进行子集,但它实际上不会把任何事情弄糟。@docendodiscimus如果在导入时指定
stringsAsFactors=FALSE
,或者将
name
转换为字符,则不会引发警告。
 df1[((df2 < 0.9) & (df2 > 0.6)) | ((df2 < 0.4) & (df2 > 0.1))] <- 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
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 <- as.character(df2$name)
 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
> df1[ !nafunc(df2) ]
 [1] "AZ1"  "AX1"  "AX2"  "2.65" "2.45" "2.56" "2.41" "2.45" "2.65" "2.85"
> 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.
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
df1[, -1][df2 %>% .[, -1] %>% as.matrix %>% 
         {(.<0.9 & .>0.6) | (.<0.4 & .>0.1)}] <- NA