首页 > 解决方案 > 如何使用 FOR 和 İF 结构缩短代码?

问题描述

我正在寻找另一个替代代码。Kodum çok uzun。

Question_No <-c(1,1,1,1,1,10,10,10,10,10,11,11,11,11,11)
Reply<-c("never","few","medium","much","complete",
             "never","few","medium","much","complete",
             "never","few","medium","much","complete")
Number_of_Answers<- c(7,1,12,13,18,6,2,12,10,21,6,2,13,11,19)
aa<- data.frame(Question_No,Reply,Number_of_Answers)
replace<- function(x)
    {Replys=x['Reply'] 
    if(Replys=="few"){return(2)}
    else if(Replys=="much"){return(4)} 
    else if(Replys=="never"){return(1)}
    else if(Replys=="medium"){return(3)}
    else {return(5)}}
  Replys<- apply(aa,MARGIN = 1,FUN = replace)
  aa['Replys']<-Replys
  aa= mutate(aa,NA_R = aa$Replys * aa$Number_of_Answers)

   aa$result = ifelse(aa$Question_No == 1,  sum(aa[1:5,5]),
                ifelse(aa$Question_No == 10, sum(aa[6:10,5]),
                ifelse(aa$Question_No == 11, sum(aa[11:15,5]),"n")))

我的代码太长了。是否有更有用的代码与 For 和 IF 而不是 IFELSE?

标签: rfor-loopif-statement

解决方案


是的,代码需要结构化和泛化,所以我希望下面的部分答案可以让您了解如何完整地解决它。避免重复 if 的一种方法是使用字典,然后使用数据库连接。R 有几个匹配和连接函数,示例使用left_join来自dplyr

library("dplyr")

df <- data.frame(
  Question_No = c(1,1,1,1,1,10,10,10,10,10,11,11,11,11,11),
  Reply = c("never","few","medium","much","complete",
           "never","few","medium","much","complete",
           "never","few","medium","much","complete"),
  Number_of_Answers = c(7,1,12,13,18,6,2,12,10,21,6,2,13,11,19)
)

dictionary <- data.frame(
  Reply = c("never", "few", "medium", "much", "complete"),
  result = 1:5
)

df2 <- left_join(df, dictionary, by="Reply")
df2

推荐阅读