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