如何生成具有简单功能的重复代码?

时间:2019-02-17 04:17:56

标签: r

如何生成此代码而不必每次都重复?

我有6列数据,如果要消除0(如果每一列中都存在),然后取平均值。

mean(grade$Q1[grade$Q1>0])
mean(grade$Q2[grade$Q2>0])
mean(grade$Q2[grade$Q3>0])
mean(grade$Q2[grade$Q4>0])
mean(grade$Q2[grade$Q5>0])
mean(grade$Q2[grade$Q6>0])

2 个答案:

答案 0 :(得分:1)

您可以使用apply和自定义参数fun

dta <- data.frame(x = c(0,0,1,2), y=c(0,1,2,3))
apply(dta, 2, function(x) mean(x[x>0]))

结果

  x   y 
1.5 2.0 

答案 1 :(得分:0)

一个选择是编写您自己的自定义函数,然后一次对数据框的一列或一组列调用它。可以在不同的数据帧上使用。这是一些代码:

# example dataset
set.seed(1234)
grade <- data.frame(
    Q1 = sample(runif(n=100, min=-10, max=100)),
    Q2 = sample(runif(n=100, min=-10, max=100)),
    Q3 = sample(runif(n=100, min=-10, max=100)),
    Q4 = sample(runif(n=100, min=-10, max=100)),
    Q5 = sample(runif(n=100, min=-10, max=100)),
    Q6 = sample(runif(n=100, min=-10, max=100))
)

# custom function
myfun <- function(df, col, threshold) {
    df <- get(df)
    vec <- df[[col]]
    mean(vec[vec>threshold])
}

# test the function
myfun(df="grade", col="Q1", threshold=0)
    #> 43.48234    

# compare function output to "manual" output
mean(grade$Q1[grade$Q1>0])
    #> 43.48234

# apply the function to many columns
mapply(myfun, c("Q1", "Q2"), MoreArgs=list(df="grade", threshold=0))
    #>       Q1        Q2 
    #> 43.48234  49.01906