替代R中的if语句

时间:2017-05-08 16:11:17

标签: r

我使用一系列if语句来检查Year是否等于某个值,然后计算一个语句。是否有更高效,更快速的方法来执行以下操作而不是使用if语句?

for tag in tags:
    if tag['Key'] == 'Email':
        print('Email is', tag['Value'])
        break

4 个答案:

答案 0 :(得分:1)

这个怎么样?

tmp <- data.frame(year = c("2012","2013","2014","2015","2016"), 
denominator = c(5408666,5300759,5410924,5446029,5480869))

for(i in 1:nrow(O)){
O[i,4] <- O$C[i]/tmp[which(as.character(tmp$year)==O$Year[i]),2]
}

答案 1 :(得分:1)

您可以使用dplyr::recodeswitch同样有效:

虚拟数据:

library(dplyr)

O <- read.table(text="SD Year C
  43 2012 4
23 2012 5
12 2014 3
53 2014 3", header=TRUE, stringsAsFactors=FALSE)

重新编码:注意要替换的值周围的反引号:

O %>% mutate(SD= recode(Year,`2012`=C/540866,
                             `2014`=C/5410924))

结果:

            SD Year C
1 7.395547e-06 2012 4
2 9.244434e-06 2012 5
3 5.544340e-07 2014 3
4 5.544340e-07 2014 3

答案 2 :(得分:0)

我很想看看如何使用switch()执行此操作,我通常会使用dplyr管道来避免必须经常键入data.frame的名称,但是这里和#39;我会在这里做什么:

O$SD <- ifelse(O$Year == '2012', O$C/5408666,
               ifelse(O$Year == '2013', O$C/5300759,
                      ifelse(O$Year == '2014', O$C/5410924,
                             ifelse(O$Year == '2015', O$C/5446029,
                                    ifelse(O$YEar == '2016', O$C/5480869, O$C))))

它不会节省大量的打字,但它确实可以保存for循环。

答案 3 :(得分:0)

如果您使用match将分母分配到每一行,我认为您效率最高。

match_year_row <- match(O$year, 2012:2016)

O$denominator <- c(5408666,5300759,5410924,5446029,5480869)[match_year_row]
O$denominator[is.na(O$denominator)] <- 1
O$SD <- with(O, C / denominator)