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 个阶段列,因此最有效的解决方案就是我所追求的。
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)
问候,