R-调用用户定义的函数时出现的问题

时间:2018-07-09 23:33:04

标签: r function

我有以下名为“数据集”的数据框

> dataset
   V1 V2 V3 V4 V5 V6   V7
1   A 29 27  0 14 21  163
2   W 70 40 93 63 44 1837
3   E 11  1 11 49 17  315
4   S 20 59 36 23 14  621
5   C 12  7 48 24 25  706
6   B 14  8 78 27 17  375
7   G 12  7  8  4  4  257
8   T  0  0  0  0  0    0
9   N 32  6  9 14 17  264
10  R 28 46 49 55 38  608
11  O 12  2  8 12 11  450

我有以下两个辅助功能

get_A <- function(p){  
     return(data.frame(Scorecard = p, 
                       Results = dataset[nrow(dataset),(p+1)]))
 }  #Pulls the value from the last row for a given value of (p and offset by  1)

get_P <- function(p){
     return(data.frame(Scorecard= p, 
                       Results = dataset[p,ncol(dataset)]))
} #Pulls the value from the last column for a given value of p

我具有以下数据框,需要在上面运行上述辅助函数。因为我正在从excel文件中读取此“ data_sub”数据帧,所以会出现NAs。这两行的行数可能不相等。

> data_sub
      Key_P     Key_A
1         2         1
2         3         3
3         4         5
4        NA        NA

当我调用辅助函数时,我得到一些奇怪的结果,如下所示:

> get_P(data_sub[complete.cases(data_sub$Key_P),]$Key_P)
  Scorecard Results
1         2    1837
2         3     315
3         4     621

> get_A(data_sub[complete.cases(data_sub$Key_A),]$Key_A)
  Scorecard Results.V2 Results.V4 Results.V6
1         1         12          8         11
2         3         12          8         11
3         5         12          8         11
Warning message:
In data.frame(Scorecard = p, Results = dataset[nrow(dataset), (p +  :
  row names were found from a short variable and have been discarded

get_P()辅助函数的调用正在按照我想要的方式工作。我正在获取data_sub$Key_P中每个非NA值的“结果”作为数据帧。

但是对get_A()辅助函数的调用给出了奇怪的结果,同时也发出了警告。我期望它提供与对get_P()的调用类似的数据帧。为什么会发生这种情况,如何使get_A()给出正确的数据帧?基本上,此输出应为

  Scorecard Results
1         1      12
2         3       8
3         5      11

我发现此链接与warning相关,但对解决我的问题没有帮助。

1 个答案:

答案 0 :(得分:0)

以下作品

get_P <- function(df, data_sub) {
    data_sub <- data_sub[complete.cases(data_sub), ]
    data.frame(
        Scorecard = data_sub$Key_P,
        Results = df[data_sub$Key_P, ncol(df)])
}
get_P(df, data_sub)
#  Scorecard Results
#1         2    1837
#2         3     315
#3         4     621

get_A <- function(df, data_sub) {
    data_sub <- data_sub[complete.cases(data_sub), ];
    data.frame(
        Scorecard = data_sub$Key_A,
        Results = as.numeric(df[nrow(df), data_sub$Key_A + 1]))
}
get_A(df, data_sub)
#  Scorecard Results
#1         1      12
#2         3       8
#3         5      11

为避免警告,我们需要在as.numeric中用get_A删除行名。

另一个提示:最好将get_Pget_A设为dfdata_sub的函数,以避免全局变量。


样本数据

df <- read.table(text =
    "   V1 V2 V3 V4 V5 V6   V7
1   A 29 27  0 14 21  163
2   W 70 40 93 63 44 1837
3   E 11  1 11 49 17  315
4   S 20 59 36 23 14  621
5   C 12  7 48 24 25  706
6   B 14  8 78 27 17  375
7   G 12  7  8  4  4  257
8   T  0  0  0  0  0    0
9   N 32  6  9 14 17  264
10  R 28 46 49 55 38  608
11  O 12  2  8 12 11  450", header = T, row.names = 1)


data_sub <- read.table(text =
    "      Key_P     Key_A
1         2         1
2         3         3
3         4         5
4        NA        NA", header = T, row.names = 1)