R如何正确地将列名作为输入

问题描述 投票:1回答:1

以下是我希望处理的数据集的一个小例子:

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中提供您对此类工作的见解,意见和建议?

非常感谢。

r
1个回答
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 
© www.soinside.com 2019 - 2024. All rights reserved.