我使用一系列if语句来检查Year是否等于某个值,然后计算一个语句。是否有更高效,更快速的方法来执行以下操作而不是使用if语句?
for tag in tags:
if tag['Key'] == 'Email':
print('Email is', tag['Value'])
break
答案 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::recode
,switch
同样有效:
虚拟数据:
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)