gpt4 book ai didi

r - R中的多列有条件地修改其他列(不创建新列)

转载 作者:行者123 更新时间:2023-12-01 12:39:43 25 4
gpt4 key购买 nike

我看到一些问题询问如何比较 R 中两列之间的值,但我一直无法弄清楚如何使用两列有条件地编辑行的其余部分。我基本上是在尝试对每一行应用不同的范围。

例如:

data <- matrix(c(0.1, 0.3, 0.1,0.5,0.4,0.2,0.3,2,2,1,0.1,0.5,0.4,0.3,0.2), nrow=3, ncol=5)
colnames(data) <- c("Min", "Lim", "Var1", "Var2", "Var3")
data
Min Lim Var1 Var2 Var3
[1,] 0.1 0.5 0.3 1.0 0.4
[2,] 0.3 0.4 2.0 0.1 0.3
[3,] 0.1 0.2 2.0 0.5 0.2

我想将 Var1、Var2 和 Var3 与 Min 和 Lim 列进行比较。如果第 1 行中的 Var1、Var2 或 Var3 值低于第 1 行中的最小值,则该值应替换为“低于最小值”。如果某个值高于 Min 但低于 Lim,则该值应替换为“Below Lim”。如果某个值同时高于 Min 和 Lim,则应保持原样。我的预期输出是:

data
Min Lim Var1 Var2 Var3
[1,] 0.1 0.5 Below Lim 1.0 Below Lim
[2,] 0.3 0.4 2.0 Below Min Below Lim
[3,] 0.1 0.2 2.0 0.5 0.2

我是 R 的新手,并尝试使用类似...的方式遍历行

for(i in 1:nrow(data){
data[i,3:5] <- ifelse(data[,3:5] > data[,1], data[,3:5], "Below LOD")
}

...但这显然不适用于多列(Var1、Var2、Var3),而且我知道在 R 中应避免循环。是否有另一种方法可以实现此目的?

我真的很感激任何人给我指出正确的方向,谢谢!

最佳答案

library(data.table)
DT <- data.table(data)

## The columns need to be converted to strings. You cannot mix strings with numbers
varCols <- grep("^Var", names(DT), value=TRUE, ignore.case=TRUE)
DT[, (varCols) := lapply(.SD, as.character), .SDcols = varCols]

DT[Var1 < Lim, Var1 := ifelse(Var1 < Min, "Below Min", "Below Lim")]
DT[Var2 < Lim, Var2 := ifelse(Var2 < Min, "Below Min", "Below Lim")]
DT[Var3 < Lim, Var3 := ifelse(Var3 < Min, "Below Min", "Below Lim")]

DT
# Min Lim Var1 Var2 Var3
# 1: 0.1 0.5 Below Lim 1 Below Lim
# 2: 0.3 0.4 2 Below Min Below Lim
# 3: 0.1 0.2 2 0.5 0.2

您可以通过编程方式执行重复行:

for (col in varCols)
DT[get(col) < Lim, (col) := ifelse((get(col)) < Min, "Below Min", "Below Lim")]

关于r - R中的多列有条件地修改其他列(不创建新列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com