【问题标题】:R keep rows where all values are < a thresholdR保留所有值<阈值的行
【发布时间】:2015-04-26 07:20:12
【问题描述】:

我有一个包含 19 列和 2000 多行的 data.frame。第 1 列是因变量,第 V1:V17 列是自变量。我想只保留列出的每个自变量的值在 0 到 0.30 之间的行。但是,每一行都有不同数量的自变量值。非值用 NA 填充,但我想或多或少“忽略”NA 值。

示例数据布局:

可重复的样本:

> dfY <- structure(list(formula_vec1 = structure(c(9L, 3L, 12L, 6L, 11L, 
5L, 8L, 2L, 7L, 1L, 10L, 4L), .Label = c("BQbinary10BQBAPA ~ BedrockGrouped", 
"BQbinary10BQBAPA ~ FlowCategory2", "BQbinary10BQBAPA ~ MixedForBinary", 
"BQbinary10BQBAPA ~ SurfGeoCode", "BQbinary10BQBAPA ~ WetBinary", 
"BQbinary10BQBAPA ~ WetForBinary", "BQbinary10TPA ~ BedrockGrouped", 
"BQbinary10TPA ~ FlowCategory2", "BQbinary10TPA ~ MixedForBinary", 
"BQbinary10TPA ~ SurfGeoCode", "BQbinary10TPA ~ WetBinary", "BQbinary10TPA ~ WetForBinary"
), class = "factor"), `(Intercept)` = c(0.273438838044101, 0.706417333314839, 
0.827323681408328, 0.827323681408328, 0.670245265976437, 1, 0.293077765083469, 
0.0729824051982314, 1, 0.178457442476982, 0.998548313507269, 
0.998548313507378), SlopeMIN = c(0.189866676669654, 0.654211112307992, 
0.544287209863837, 0.544287209863837, 0.994937849813948, 0.999999999999999, 
0.191210657045005, 0.03858791129829, 0.994491578112418, 0.994856875070902, 
0.997947006402924, 0.997947006406413), V3 = c(NA, NA, NA, NA, 
NA, NA, NA, NA, 1, 0.132226649521136, 0.997947006402968, 0.999999999999613
), V4 = c(NA, NA, NA, NA, NA, NA, NA, NA, 0.818915198441539, 
0.0971466407595114, 1, 0.997629408064154), V5 = c(NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 0.999999999999979, 0.997947006406465
), V6 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.999999999999999, 
0.997947006406414), V7 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 0.998510413314225, 0.998586213707042), V8 = c(NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 0.999999999999999, 0.997947006406413
), V9 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
    V10 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_), V11 = c(NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), V12 = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_), V13 = c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), V14 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), V15 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), V16 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), V17 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), V18 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), .Names = c("formula_vec1", 
"(Intercept)", "SlopeMIN", "V3", "V4", "V5", "V6", "V7", "V8", 
"V9", "V10", "V11", "V12", "V13", "V14", "V15", "V16", "V17", 
"V18"), row.names = 9:20, class = "data.frame")

预期输出(仅保留所有自变量均

在这个小子集中,只有 V1 中的值

我尝试使用最小值来提取我想要的行,但这只会获取每行中的最小值,我需要所有值都为

我也尝试对数据进行子集化,但我对 NA 值感到困惑:

dfOutput 0.00000001 | dfInput[,3:19]

任何关于从这里去哪里的想法将不胜感激。

【问题讨论】:

  • 提供一个最小的可重现示例。如果数据不是很有帮助,请截图。
  • 我试过了,但是每次我在 R 的一个小子集上使用 dput 时,我都会得到整个 data.frame 的结构。如果您对如何提取一小部分代码有任何建议,我很想知道如何。
  • dput(dfInput[1:20, 1:20]) 您应该尝试使用 before 子集化的 or 语句。然后如果你只想要每一行的 all TRUE,使用 all

标签: r rows subset


【解决方案1】:

这应该可行:

dfOutput <- dfInput[apply(dfInput[,3:19]>0.00000001 & dfInput[,3:19]<0.300, 1, all, na.rm=TRUE),  ]

现在对于一个可重现的示例,我将解释发生了什么:

# data
df <- data.frame(x = c(1:3, NA, 3:1), y=c(NA, NA, NA, 3, 3, 2, 3))
# this returns a matrix!
df[, 1:2] > 2
# use apply
apply(df[, 1:2] > 2, 1, all)
# "ignore" NA's
apply(df[, 1:2] > 2, 1, all, na.rm=TRUE)
# finally you do
df[apply(df[, 1:2] > 2, 1, all, na.rm=TRUE), ]

【讨论】:

  • 我刚刚尝试运行它,结果输出的 data.frame 与我的输入 data.frame 相同;没有删除任何行。有什么想法吗?
  • 您的条件大于 0.00001 或小于 0.3。我的猜测是大多数数字都符合这个条件。也许您的意思是 &amp; 而不是 |
  • 我在寻找 AND,而不是 OR,对不起!我希望所有值都在 0 到 0.30 之间。我改变了|到&,它运行得很完美!
猜你喜欢
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
相关资源
最近更新 更多