如何生成此代码而不必每次都重复?
我有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])
答案 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