以下是我希望处理的数据集的一个小例子:
df = setNames(data.frame(matrix(1:100,10)), c("Dis_N1", "Dis_N2", "Dis_N3", "Dis_N4", "Dis_N5", "Dis_N6", "Dis_N7", "Dis_N8", "Dis_N9", "Dis_N10"))
FilterGap = setNames(data.frame(matrix(1:10,1)), c("Dis_N1", "Dis_N2", "Dis_N3", "Dis_N4", "Dis_N5", "Dis_N6", "Dis_N7", "Dis_N8", "Dis_N9", "Dis_N10"))
我有另一个函数(FrcGap,见下文),根据FilterGap中的值处理df数据集。
旧功能(不工作):
FrcGap = function(Var){length(na.omit(df$Var[df$Var > FilterGap$Var])) / length(na.omit(df$Var))}
我查看其他帖子并注意到我需要将$转换为[[在函数中]。所以,我将旧函数修改为新函数。
新功能(不工作):
FrcGap = function(Var){length( na.omit( df[[Var[df$Var > FilterGap$Var]]] ) ) / length( na.omit( df[[Var]] ) )}
我也意识到新功能不易理解,也有错误。
错误:
> FrcGap("Dis_N1")
Show Traceback
Rerun with Debug
Error in .subset2(x, i, exact = exact) : no such index at level 1
手动程序(可行): 如果我手动将Var ID逐个插入到函数中,它实际上可以正常工作。
length(na.omit(df$Dis_N1[df$Dis_N1 > FilterGap$Dis_N1])) / length(na.omit(df$Dis_N1))
length(na.omit(df$Dis_N2[df$Dis_N2 > FilterGap$Dis_N2])) / length(na.omit(df$Dis_N2))
length(na.omit(df$Dis_N10[df$Dis_N10 > FilterGap$Dis_N10])) / length(na.omit(df$Dis_N10))
您能否在R?
中提供您对此类工作的见解,意见和建议?非常感谢。
答案 0 :(得分:1)
好的,感谢您添加示例数据,我可以让“旧”功能正常工作。
FrcGap = function(var1, var2){
length(na.omit(var1[var1 > var2])) / length(na.omit(var1))
}
如果要在一组值上运行它,可以执行以下操作:
FrcGap(df$Dis_N1, FilterGap$Dis_N1)
[1] 0.9
或者,如果您想完全在dataframes
上运行它,可以使用mapply
mapply(FrcGap, df, FilterGap)
Dis_N1 Dis_N2 Dis_N3 Dis_N4 Dis_N5 Dis_N6 Dis_N7 Dis_N8 Dis_N9 Dis_N10
0.9 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0