"R" 警告消息:在 mapply 中,较长的参数不是较短的长度的倍数

"R" Warning message: In mapply longer argument not a multiple of length of shorter

我正在尝试制作一个简单的函数来反转我的 R 数据框中的多列代码。我正在使用 lapply 和 mapply 在函数中,这似乎给了我预期的结果,除了警告消息

Warning message:
In mapply("-", max_value, data[, rev]) :
  longer argument not a multiple of length of shorter

为了说明,这里有一些示例数据

{
A = c(3, 3, 3, 3, 3, 3, 3, 3, 3, 3)
B = c(9, 2, 3, 2, 4, 0, 2, 7, 2, 8)
C = c(2, 4, 1, 0, 2, 1, 3, 0, 7, 8)

df1 = data.frame(A, B, C)
print(df1)
}
   A B C
1  3 9 2
2  3 2 4
3  3 3 1
4  3 2 0
5  3 4 2
6  3 0 1
7  3 2 3
8  3 7 0
9  3 2 7
10 3 8 8

反码函数如下:

## columns to reverse-code
revcode_cols = c("A", "B")

## function to reverse code variables
reverseCode <- function(data, rev){
  
  # get maximum value per column 
  max_value = lapply(data, max)
  
  # subtract values in designated cols from max value plus 1
  data[, rev] = mapply("-", max_value, data[, rev]) + 1
  
  return(data)
  
}

reverseCode(df1, revcode_cols)

   A  B C
1  1  1 2
2  1  8 4
3  1  7 1
4  1  8 0
5  1  6 2
6  1 10 1
7  1  8 3
8  1  3 0
9  1  8 7
10 1  2 8

它给出了正确的输出,但用于警告消息。只是想知道我需要修复脚本的哪一部分才能消除警告消息。

data.frame 的单位是列,向量的单位是单个元素。在 mapply/Map 中,我们传递了两个输入,但在 OP 的代码中,max 是在整个数据集上计算的,创建了一个 'max_value' 作为 3 个元素的 list ,其中 data[, rev] 的长度为 2。我们只需要对数据进行子集计算 max

reverseCode <- function(data, rev){
  
  # get maximum value per column 
  max_value = lapply(data[rev], max)
  
  # subtract values in designated cols from max value plus 1
  data[, rev] = mapply("-", max_value, data[, rev]) + 1
  
  return(data)
  
}

-测试

reverseCode(df1, revcode_cols)
   A  B C
1  1  1 2
2  1  8 4
3  1  7 1
4  1  8 0
5  1  6 2
6  1 10 1
7  1  8 3
8  1  3 0
9  1  8 7
10 1  2 8

您可以在一个 lapply.

中完成此操作,而不是使用两个应用循环
reverseCode <- function(data, rev){
  data[rev] <- lapply(data[rev], function(x) max(x) - x + 1)
  data
}

reverseCode(df1, c("A", "B"))

#   A  B C
#1  1  1 2
#2  1  8 4
#3  1  7 1
#4  1  8 0
#5  1  6 2
#6  1 10 1
#7  1  8 3
#8  1  3 0
#9  1  8 7
#10 1  2 8