在r中使用ifelse语句加速double for循环的建议?
我有下面的代码,它产生了我想要的东西,但我几乎可以肯定它可以写得更好(而且它需要很长时间才能执行)。有什么建议可以帮我清理一下吗 基本思想是,我想要一个表,其中包含变量在r中使用ifelse语句加速double for循环的建议?,r,if-statement,for-loop,R,If Statement,For Loop,我有下面的代码,它产生了我想要的东西,但我几乎可以肯定它可以写得更好(而且它需要很长时间才能执行)。有什么建议可以帮我清理一下吗 基本思想是,我想要一个表,其中包含变量var3中的“最高”字母(a、B或C),用于var1ogvar2 var1 <- c(rep.int(1:3,3)) var2 <- c(sample(letters[1:3], NROW(var1), replace = TRUE)) var3 &l
var3
中的“最高”字母(a、B或C),用于var1
ogvar2
var1 <- c(rep.int(1:3,3))
var2 <- c(sample(letters[1:3],
NROW(var1),
replace = TRUE))
var3 <- c(sample(LETTERS[1:3],
NROW(var1),
replace = TRUE))
df <- data.frame(var1,
var2,
var3)
x <- capture.output(for (i in unique(df$var1)) {
for (j in unique(df$var2)) {
ifelse(
"A" %in% subset(df,
df$var1 == i &
df$var2 == j,
select = c(var3))[,1]
,print("A"),
ifelse(
"B" %in% subset(df,
df$var1 == i &
df$var2 == j,
select = c(var3))[,1],
print("B"),
ifelse(
"C" %in% subset(df,
df$var1 == i &
df$var2 == j,
select = c(var3))[,1],
print("C"),0
)
)
)
}
})
as.data.frame(cbind(x,unique(paste(df$var1,df$var2))))
var1我会使用dplyr
,如下所示:
library("dplyr")
df %>%
group_by(var1, var2) %>%
summarise(maksymalna=max(as.character(var3)))
它的输出与您的不同(可能您的函数中有错误),但我认为它是正确的。你能检查一下吗?我们可以使用数据表。我们将“data.frame”转换为“data.table”(setDT(df)
),按“var1”和“var2”分组,我们将“var3”转换为指定了级别的因子,得到最小值的索引(which.min
),并对数据集进行子集(.SD
)
或者在分组后,我们通过“var3”将顺序
转换为因子
,并获得Data.table(.SD
)子集的第一个观察值
你所说的“最高”是什么意思?A>B>C,即如果A存在,那么我想要A,如果B,那么B等等。没有得到正确的结果,因为有时我的组合中会有A没有正确返回,但是谢谢你的建议!
library(data.table)
setDT(df)[, .SD[which.min(factor(var3,
levels=LETTERS[1:3]))] ,.(var1, var2)]
setDT(df)[order(factor(var3, levels=LETTERS[1:3])),
head(.SD, 1L), .(var1, var2)]