选择至少具有一个(任何)负值的行

win*_*liz 1 r data-manipulation subset data.table

我正在创建一个新的 data.table,其中包含至少具有一个负值的所有行。

这是一个简单的可重现数据表:

dt <- data.table(
  ID = c(42, 43, 44),
  Stage_1 = c(-6, 7, 4),
  Stage_2 = c(-15, 4, -8),
  Stage_3 = c(-20, 2, -5)
)

#    ID Stage_1 Stage_2 Stage_3
# 1: 42      -6     -15     -20 # <~~ row to be selected (> 0 negative values)
# 2: 43       7       4       2
# 3: 44       4      -8      -5 # <~~ row to be selected (> 0 negative values)
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

dt2 <- data.table(
  ID = c(42, 44),
  Stage_1 = c(-6, 4),
  Stage_2 = c(-15, -8),
  Stage_3 = c(-20, -5)
)

#    ID Stage_1 Stage_2 Stage_3
# 1: 42      -6     -15     -20
# 2: 44       4      -8      -5
Run Code Online (Sandbox Code Playgroud)

例如,ID 44 有两个负值,但我想包含主数据表中的所有行。基本上,我想将所有列中具有负值的行添加到包含所有信息的新数据表

我正在使用的实际数据集有大约 50 个阶段列,因此最有效的解决方案就是我所追求的。

bar*_*tte 5

dt <- data.table::data.table(
  ID = c(42, 43, 44),
  Stage_1 = c(-6, 7, 4),
  Stage_2 = c(-15, 4, -8),
  Stage_3 = c(-20, 2, -5)
)

dt
#>    ID Stage_1 Stage_2 Stage_3
#> 1: 42      -6     -15     -20
#> 2: 43       7       4       2
#> 3: 44       4      -8      -5
Run Code Online (Sandbox Code Playgroud)
  • 具有apply()功能:
dt[apply(dt[, -'ID'], 1, min) < 0, ]
#>    ID Stage_1 Stage_2 Stage_3
#> 1: 42      -6     -15     -20
#> 2: 44       4      -8      -5
Run Code Online (Sandbox Code Playgroud)
  • 函数rowMeans()基于以下事实:至少具有一个真值的布尔向量的平均值始终大于零(感谢@utubun):
dt[rowMeans(dt[, -'ID'] < 0) > 0, ]
#>    ID Stage_1 Stage_2 Stage_3
#> 1: 42      -6     -15     -20
#> 2: 44       4      -8      -5
Run Code Online (Sandbox Code Playgroud)
  • 还有包rowMins()的功能fBasics
dt[fBasics::rowMins(dt[, -'ID']) < 0, ]
#>    ID Stage_1 Stage_2 Stage_3
#> 1: 42      -6     -15     -20
#> 2: 44       4      -8      -5

# Created on 2021-02-19 by the reprex package (v0.3.0.9001)
Run Code Online (Sandbox Code Playgroud)

(与 min() 等效于 rowMeans()相关)

问候,

  • 是我,还是实际上你的意思是“dt[, 2:ncol(dt)]”?它之所以有效,是因为它是平方数据,但否则它将无法正常工作。 (2认同)