在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
og
var2

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)]