我想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)
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)
我将非常感谢这里的语法帮助.
手动引入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完全如上所述调用,此代码将引发警告
Run Code Online (Sandbox Code Playgroud)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列没有任何作用,因此无论警告如何,结果都是我们想要的结果.
通过改变name角色,或者不首先将其变成一个因素,可以完全避免警告.stringsAsFactors = FALSE在read.table读入数据时指定选项,或者在上面添加前一行
df2$name <- as.character(df2$name)
Run Code Online (Sandbox Code Playgroud)
由于很明显R不会将字符串和数字与不等式进行比较,因此不再提出警告.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |