在粘贴功能

时间:2019-08-06 17:05:31

标签: r

假设我想使用-在data.frame datasets::cars的两列中的所有值之前添加减号apply

> apply(cars[1:5,], 2, paste0, "-")
      speed dist 
  [1,] "4-"  "2-" 
  [2,] "4-"  "10-"
  [3,] "7-"  "4-" 
  [4,] "7-"  "22-"
  [5,] "8-"  "16-"

请注意,这里的减号是后面的不在前面的数字。因此,我想出了以下给出所需输出的内容:

> apply(cars[1:5,], 2, function(x) paste0("-", x))
        speed dist 
   [1,] "-4"  "-2" 
   [2,] "-4"  "-10"
   [3,] "-7"  "-4" 
   [4,] "-7"  "-22"
   [5,] "-8"  "-16"

但是,这让我感到困惑:是否有一种方法可以直接指定paste函数中负号的位置,或者相反地指定边距值的位置?

2 个答案:

答案 0 :(得分:3)

paste0的语法为paste0(..., collapse = NULL)。也就是说,它按照参数出现的顺序并将其粘贴在一起。 apply的语法为apply(X, MARGIN, FUN, ...),其中...代表其他参数,这些参数在位置2、3上的paste0的子集元素之后传递给X等等。由于apply始终x始终排在第一位,因此无法避免匿名功能。
即参数必须为FUN = function(x) paste0("-", x)才能强制paste0将“-”放在第一位。

答案 1 :(得分:1)

您可以尝试使用一些正则表达式

> sapply(cars[1:5,], function(x) sub("(.*)", "-\\1", x))  # infront
     speed dist 
[1,] "-4"  "-2" 
[2,] "-4"  "-10"
[3,] "-7"  "-4" 
[4,] "-7"  "-22"
[5,] "-8"  "-16"
> sapply(cars[1:5,], function(x) sub("(.*)", "\\1-", x))  # behind
     speed dist 
[1,] "4-"  "2-" 
[2,] "4-"  "10-"
[3,] "7-"  "4-" 
[4,] "7-"  "22-"
[5,] "8-"  "16-"
> sapply(cars[1:5,], function(x) sub("(.{1})(.*)", "\\1-\\2", x))  # between
     speed dist 
[1,] "4-"  "2-" 
[2,] "4-"  "1-0"
[3,] "7-"  "4-" 
[4,] "7-"  "2-2"
[5,] "8-"  "1-6"