在r中使用ifelse语句加速double for循环的建议?

时间:2015-12-22 11:05:35

标签: r if-statement for-loop

我有以下代码,它产生我想要的东西,但我几乎可以肯定它可以写得更好(也需要很长时间才能执行)。有关如何清理它的任何建议吗?

我的基本想法是,对于var3 og var1的每个唯一组合,我想要一个包含变量var2中“最高”字母(A,B或C)的表格

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

2 个答案:

答案 0 :(得分:2)

我们可以使用data.table。我们将'data.frame'转换为'data.table'(setDT(df)),按'var1'分组,'var2',我们将'var3'转换为factor {{1}指定,获取最小值索引(levels)并对数据集(which.min)进行子集

.SD

或者在分组后,我们将library(data.table) setDT(df)[, .SD[which.min(factor(var3, levels=LETTERS[1:3]))] ,.(var1, var2)] 'var3'转换为order并获得Data.table(factor)子集的第一次观察。

.SD

答案 1 :(得分:0)

我会使用dplyr,就像这里:

library("dplyr")

df %>% 
    group_by(var1, var2) %>% 
    summarise(maksymalna=max(as.character(var3)))

它提供的输出与你的输出不同(可能是你的功能错了),但我认为这是正确的。你能查一下吗?