当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R purrr modify 有选择地修改元素


map() 及其变体始终返回固定对象类型(map() 的列表、map_int() 的整数向量等)不同,modify() 系列始终返回与输入对象相同的类型。

  • modify()x[[i]] <- f(x[[i]]); return(x) 的快捷方式。

  • modify_if() 仅修改 x 中满足谓词的元素,其他元素保持不变。 modify_at() 仅修改由名称或位置给出的元素。

  • modify2() 修改 .x 的元素,但也将 .y 的元素传递给 .f ,就像 map2() 一样。 imodify() 将名称或索引传递给 .f,就像 imap() 一样。

  • modify_in() 修改 pluck() 位置中的单个元素。

用法

modify(.x, .f, ...)

modify_if(.x, .p, .f, ..., .else = NULL)

modify_at(.x, .at, .f, ...)

modify2(.x, .y, .f, ...)

imodify(.x, .f, ...)

参数

.x

一个向量。

.f

以与相应的映射函数相同的方式指定的函数。

...

传递给映射函数的附加参数。

我们现在通常建议不要使用 ... 将附加(常量)参数传递给 .f 。相反,使用简写匿名函数:

# Instead of
x |> map(f, 1, 2, collapse = ",")
# do:
x |> map(\(x) f(x, 1, 2, collapse = ","))

这使得更容易理解哪些参数属于哪个函数,并且往往会产生更好的错误消息。

.p

单个谓词函数、说明此类谓词函数的公式或与 .x 长度相同的逻辑向量。或者,如果 .x 的元素本身是对象列表,则为指示内部列表中逻辑元素名称的字符串。只有.p 计算结果为TRUE 的元素才会被修改。

.else

应用于 .x 元素的函数,其中 .p 返回 FALSE

.at

给出要选择的元素的逻辑向量、整数向量或字符向量。或者,函数接受名称向量,并返回要选择的元素的逻辑向量、整数向量或字符向量。

[Deprecated]:如果安装了 tidyselect 软件包,则可以使用vars()和 tidyselect 帮助器来选择元素。

.y

向量,通常与 .x 长度相同。

.x 相同类的对象

细节

由于变换可以改变输入的结构;您有责任确保转换产生有效的输出。例如,如果您要修改数据帧,.f 必须保留输入的长度。

通用性

modify() 和变体对于实现 length()[[[[<- 方法的类是通用的。如果默认实现与您的类不兼容,您可以使用自己的方法覆盖它们。

如果您实现自己的 modify() 方法,请确保它满足以下不变量:

modify(x, identity) === x
modify(x, compose(f, g)) === modify(x, g) |> modify(f)

这些不变量在计算机科学中被称为functor laws

也可以看看

其他Map变体: imap()lmap()map2()map_depth()map_if()map()pmap()

其他修改变体:map_depth()modify_tree()

例子

# Convert factors to characters
iris |>
  modify_if(is.factor, as.character) |>
  str()
#> 'data.frame':	150 obs. of  5 variables:
#>  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#>  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#>  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#>  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#>  $ Species     : chr  "setosa" "setosa" "setosa" "setosa" ...

# Specify which columns to map with a numeric vector of positions:
mtcars |> modify_at(c(1, 4, 5), as.character) |> str()
#> 'data.frame':	32 obs. of  11 variables:
#>  $ mpg : chr  "21" "21" "22.8" "21.4" ...
#>  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
#>  $ disp: num  160 160 108 258 360 ...
#>  $ hp  : chr  "110" "110" "93" "110" ...
#>  $ drat: chr  "3.9" "3.9" "3.85" "3.08" ...
#>  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
#>  $ qsec: num  16.5 17 18.6 19.4 17 ...
#>  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
#>  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
#>  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
#>  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

# Or with a vector of names:
mtcars |> modify_at(c("cyl", "am"), as.character) |> str()
#> 'data.frame':	32 obs. of  11 variables:
#>  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
#>  $ cyl : chr  "6" "6" "4" "6" ...
#>  $ disp: num  160 160 108 258 360 ...
#>  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
#>  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
#>  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
#>  $ qsec: num  16.5 17 18.6 19.4 17 ...
#>  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
#>  $ am  : chr  "1" "1" "1" "0" ...
#>  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
#>  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

list(x = sample(c(TRUE, FALSE), 100, replace = TRUE), y = 1:100) |>
  list_transpose(simplify = FALSE) |>
  modify_if("x", \(l) list(x = l$x, y = l$y * 100)) |>
  list_transpose()
#> $x
#>   [1] FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE
#>  [12] FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE
#>  [23] FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE
#>  [34] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
#>  [45] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE
#>  [56] FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE
#>  [67] FALSE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
#>  [78] FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE
#>  [89]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE
#> [100]  TRUE
#> 
#> $y
#>   [1]     1   200   300     4     5     6     7   800     9  1000  1100
#>  [12]    12  1300  1400  1500    16  1700    18  1900    20  2100  2200
#>  [23]    23  2400  2500    26    27  2800    29  3000    31  3200    33
#>  [34]    34    35  3600    37    38    39    40    41  4200    43    44
#>  [45]    45    46  4700    48    49  5000    51  5200    53  5400  5500
#>  [56]    56  5700  5800    59    60    61    62    63  6400  6500    66
#>  [67]    67  6800    69    70  7100  7200  7300  7400  7500    76    77
#>  [78]    78    79  8000    81  8200    83  8400  8500  8600    87    88
#>  [89]  8900  9000    91    92  9300  9400    95    96  9700    98  9900
#> [100] 10000
#> 

# Use modify2() to map over two vectors and preserve the type of
# the first one:
x <- c(foo = 1L, bar = 2L)
y <- c(TRUE, FALSE)
modify2(x, y, \(x, cond) if (cond) x else 0L)
#> foo bar 
#>   1   0 

# Use a predicate function to decide whether to map a function:
modify_if(iris, is.factor, as.character)
#>     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#> 1            5.1         3.5          1.4         0.2     setosa
#> 2            4.9         3.0          1.4         0.2     setosa
#> 3            4.7         3.2          1.3         0.2     setosa
#> 4            4.6         3.1          1.5         0.2     setosa
#> 5            5.0         3.6          1.4         0.2     setosa
#> 6            5.4         3.9          1.7         0.4     setosa
#> 7            4.6         3.4          1.4         0.3     setosa
#> 8            5.0         3.4          1.5         0.2     setosa
#> 9            4.4         2.9          1.4         0.2     setosa
#> 10           4.9         3.1          1.5         0.1     setosa
#> 11           5.4         3.7          1.5         0.2     setosa
#> 12           4.8         3.4          1.6         0.2     setosa
#> 13           4.8         3.0          1.4         0.1     setosa
#> 14           4.3         3.0          1.1         0.1     setosa
#> 15           5.8         4.0          1.2         0.2     setosa
#> 16           5.7         4.4          1.5         0.4     setosa
#> 17           5.4         3.9          1.3         0.4     setosa
#> 18           5.1         3.5          1.4         0.3     setosa
#> 19           5.7         3.8          1.7         0.3     setosa
#> 20           5.1         3.8          1.5         0.3     setosa
#> 21           5.4         3.4          1.7         0.2     setosa
#> 22           5.1         3.7          1.5         0.4     setosa
#> 23           4.6         3.6          1.0         0.2     setosa
#> 24           5.1         3.3          1.7         0.5     setosa
#> 25           4.8         3.4          1.9         0.2     setosa
#> 26           5.0         3.0          1.6         0.2     setosa
#> 27           5.0         3.4          1.6         0.4     setosa
#> 28           5.2         3.5          1.5         0.2     setosa
#> 29           5.2         3.4          1.4         0.2     setosa
#> 30           4.7         3.2          1.6         0.2     setosa
#> 31           4.8         3.1          1.6         0.2     setosa
#> 32           5.4         3.4          1.5         0.4     setosa
#> 33           5.2         4.1          1.5         0.1     setosa
#> 34           5.5         4.2          1.4         0.2     setosa
#> 35           4.9         3.1          1.5         0.2     setosa
#> 36           5.0         3.2          1.2         0.2     setosa
#> 37           5.5         3.5          1.3         0.2     setosa
#> 38           4.9         3.6          1.4         0.1     setosa
#> 39           4.4         3.0          1.3         0.2     setosa
#> 40           5.1         3.4          1.5         0.2     setosa
#> 41           5.0         3.5          1.3         0.3     setosa
#> 42           4.5         2.3          1.3         0.3     setosa
#> 43           4.4         3.2          1.3         0.2     setosa
#> 44           5.0         3.5          1.6         0.6     setosa
#> 45           5.1         3.8          1.9         0.4     setosa
#> 46           4.8         3.0          1.4         0.3     setosa
#> 47           5.1         3.8          1.6         0.2     setosa
#> 48           4.6         3.2          1.4         0.2     setosa
#> 49           5.3         3.7          1.5         0.2     setosa
#> 50           5.0         3.3          1.4         0.2     setosa
#> 51           7.0         3.2          4.7         1.4 versicolor
#> 52           6.4         3.2          4.5         1.5 versicolor
#> 53           6.9         3.1          4.9         1.5 versicolor
#> 54           5.5         2.3          4.0         1.3 versicolor
#> 55           6.5         2.8          4.6         1.5 versicolor
#> 56           5.7         2.8          4.5         1.3 versicolor
#> 57           6.3         3.3          4.7         1.6 versicolor
#> 58           4.9         2.4          3.3         1.0 versicolor
#> 59           6.6         2.9          4.6         1.3 versicolor
#> 60           5.2         2.7          3.9         1.4 versicolor
#> 61           5.0         2.0          3.5         1.0 versicolor
#> 62           5.9         3.0          4.2         1.5 versicolor
#> 63           6.0         2.2          4.0         1.0 versicolor
#> 64           6.1         2.9          4.7         1.4 versicolor
#> 65           5.6         2.9          3.6         1.3 versicolor
#> 66           6.7         3.1          4.4         1.4 versicolor
#> 67           5.6         3.0          4.5         1.5 versicolor
#> 68           5.8         2.7          4.1         1.0 versicolor
#> 69           6.2         2.2          4.5         1.5 versicolor
#> 70           5.6         2.5          3.9         1.1 versicolor
#> 71           5.9         3.2          4.8         1.8 versicolor
#> 72           6.1         2.8          4.0         1.3 versicolor
#> 73           6.3         2.5          4.9         1.5 versicolor
#> 74           6.1         2.8          4.7         1.2 versicolor
#> 75           6.4         2.9          4.3         1.3 versicolor
#> 76           6.6         3.0          4.4         1.4 versicolor
#> 77           6.8         2.8          4.8         1.4 versicolor
#> 78           6.7         3.0          5.0         1.7 versicolor
#> 79           6.0         2.9          4.5         1.5 versicolor
#> 80           5.7         2.6          3.5         1.0 versicolor
#> 81           5.5         2.4          3.8         1.1 versicolor
#> 82           5.5         2.4          3.7         1.0 versicolor
#> 83           5.8         2.7          3.9         1.2 versicolor
#> 84           6.0         2.7          5.1         1.6 versicolor
#> 85           5.4         3.0          4.5         1.5 versicolor
#> 86           6.0         3.4          4.5         1.6 versicolor
#> 87           6.7         3.1          4.7         1.5 versicolor
#> 88           6.3         2.3          4.4         1.3 versicolor
#> 89           5.6         3.0          4.1         1.3 versicolor
#> 90           5.5         2.5          4.0         1.3 versicolor
#> 91           5.5         2.6          4.4         1.2 versicolor
#> 92           6.1         3.0          4.6         1.4 versicolor
#> 93           5.8         2.6          4.0         1.2 versicolor
#> 94           5.0         2.3          3.3         1.0 versicolor
#> 95           5.6         2.7          4.2         1.3 versicolor
#> 96           5.7         3.0          4.2         1.2 versicolor
#> 97           5.7         2.9          4.2         1.3 versicolor
#> 98           6.2         2.9          4.3         1.3 versicolor
#> 99           5.1         2.5          3.0         1.1 versicolor
#> 100          5.7         2.8          4.1         1.3 versicolor
#> 101          6.3         3.3          6.0         2.5  virginica
#> 102          5.8         2.7          5.1         1.9  virginica
#> 103          7.1         3.0          5.9         2.1  virginica
#> 104          6.3         2.9          5.6         1.8  virginica
#> 105          6.5         3.0          5.8         2.2  virginica
#> 106          7.6         3.0          6.6         2.1  virginica
#> 107          4.9         2.5          4.5         1.7  virginica
#> 108          7.3         2.9          6.3         1.8  virginica
#> 109          6.7         2.5          5.8         1.8  virginica
#> 110          7.2         3.6          6.1         2.5  virginica
#> 111          6.5         3.2          5.1         2.0  virginica
#> 112          6.4         2.7          5.3         1.9  virginica
#> 113          6.8         3.0          5.5         2.1  virginica
#> 114          5.7         2.5          5.0         2.0  virginica
#> 115          5.8         2.8          5.1         2.4  virginica
#> 116          6.4         3.2          5.3         2.3  virginica
#> 117          6.5         3.0          5.5         1.8  virginica
#> 118          7.7         3.8          6.7         2.2  virginica
#> 119          7.7         2.6          6.9         2.3  virginica
#> 120          6.0         2.2          5.0         1.5  virginica
#> 121          6.9         3.2          5.7         2.3  virginica
#> 122          5.6         2.8          4.9         2.0  virginica
#> 123          7.7         2.8          6.7         2.0  virginica
#> 124          6.3         2.7          4.9         1.8  virginica
#> 125          6.7         3.3          5.7         2.1  virginica
#> 126          7.2         3.2          6.0         1.8  virginica
#> 127          6.2         2.8          4.8         1.8  virginica
#> 128          6.1         3.0          4.9         1.8  virginica
#> 129          6.4         2.8          5.6         2.1  virginica
#> 130          7.2         3.0          5.8         1.6  virginica
#> 131          7.4         2.8          6.1         1.9  virginica
#> 132          7.9         3.8          6.4         2.0  virginica
#> 133          6.4         2.8          5.6         2.2  virginica
#> 134          6.3         2.8          5.1         1.5  virginica
#> 135          6.1         2.6          5.6         1.4  virginica
#> 136          7.7         3.0          6.1         2.3  virginica
#> 137          6.3         3.4          5.6         2.4  virginica
#> 138          6.4         3.1          5.5         1.8  virginica
#> 139          6.0         3.0          4.8         1.8  virginica
#> 140          6.9         3.1          5.4         2.1  virginica
#> 141          6.7         3.1          5.6         2.4  virginica
#> 142          6.9         3.1          5.1         2.3  virginica
#> 143          5.8         2.7          5.1         1.9  virginica
#> 144          6.8         3.2          5.9         2.3  virginica
#> 145          6.7         3.3          5.7         2.5  virginica
#> 146          6.7         3.0          5.2         2.3  virginica
#> 147          6.3         2.5          5.0         1.9  virginica
#> 148          6.5         3.0          5.2         2.0  virginica
#> 149          6.2         3.4          5.4         2.3  virginica
#> 150          5.9         3.0          5.1         1.8  virginica

# Specify an alternative with the `.else` argument:
modify_if(iris, is.factor, as.character, .else = as.integer)
#>     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#> 1              5           3            1           0     setosa
#> 2              4           3            1           0     setosa
#> 3              4           3            1           0     setosa
#> 4              4           3            1           0     setosa
#> 5              5           3            1           0     setosa
#> 6              5           3            1           0     setosa
#> 7              4           3            1           0     setosa
#> 8              5           3            1           0     setosa
#> 9              4           2            1           0     setosa
#> 10             4           3            1           0     setosa
#> 11             5           3            1           0     setosa
#> 12             4           3            1           0     setosa
#> 13             4           3            1           0     setosa
#> 14             4           3            1           0     setosa
#> 15             5           4            1           0     setosa
#> 16             5           4            1           0     setosa
#> 17             5           3            1           0     setosa
#> 18             5           3            1           0     setosa
#> 19             5           3            1           0     setosa
#> 20             5           3            1           0     setosa
#> 21             5           3            1           0     setosa
#> 22             5           3            1           0     setosa
#> 23             4           3            1           0     setosa
#> 24             5           3            1           0     setosa
#> 25             4           3            1           0     setosa
#> 26             5           3            1           0     setosa
#> 27             5           3            1           0     setosa
#> 28             5           3            1           0     setosa
#> 29             5           3            1           0     setosa
#> 30             4           3            1           0     setosa
#> 31             4           3            1           0     setosa
#> 32             5           3            1           0     setosa
#> 33             5           4            1           0     setosa
#> 34             5           4            1           0     setosa
#> 35             4           3            1           0     setosa
#> 36             5           3            1           0     setosa
#> 37             5           3            1           0     setosa
#> 38             4           3            1           0     setosa
#> 39             4           3            1           0     setosa
#> 40             5           3            1           0     setosa
#> 41             5           3            1           0     setosa
#> 42             4           2            1           0     setosa
#> 43             4           3            1           0     setosa
#> 44             5           3            1           0     setosa
#> 45             5           3            1           0     setosa
#> 46             4           3            1           0     setosa
#> 47             5           3            1           0     setosa
#> 48             4           3            1           0     setosa
#> 49             5           3            1           0     setosa
#> 50             5           3            1           0     setosa
#> 51             7           3            4           1 versicolor
#> 52             6           3            4           1 versicolor
#> 53             6           3            4           1 versicolor
#> 54             5           2            4           1 versicolor
#> 55             6           2            4           1 versicolor
#> 56             5           2            4           1 versicolor
#> 57             6           3            4           1 versicolor
#> 58             4           2            3           1 versicolor
#> 59             6           2            4           1 versicolor
#> 60             5           2            3           1 versicolor
#> 61             5           2            3           1 versicolor
#> 62             5           3            4           1 versicolor
#> 63             6           2            4           1 versicolor
#> 64             6           2            4           1 versicolor
#> 65             5           2            3           1 versicolor
#> 66             6           3            4           1 versicolor
#> 67             5           3            4           1 versicolor
#> 68             5           2            4           1 versicolor
#> 69             6           2            4           1 versicolor
#> 70             5           2            3           1 versicolor
#> 71             5           3            4           1 versicolor
#> 72             6           2            4           1 versicolor
#> 73             6           2            4           1 versicolor
#> 74             6           2            4           1 versicolor
#> 75             6           2            4           1 versicolor
#> 76             6           3            4           1 versicolor
#> 77             6           2            4           1 versicolor
#> 78             6           3            5           1 versicolor
#> 79             6           2            4           1 versicolor
#> 80             5           2            3           1 versicolor
#> 81             5           2            3           1 versicolor
#> 82             5           2            3           1 versicolor
#> 83             5           2            3           1 versicolor
#> 84             6           2            5           1 versicolor
#> 85             5           3            4           1 versicolor
#> 86             6           3            4           1 versicolor
#> 87             6           3            4           1 versicolor
#> 88             6           2            4           1 versicolor
#> 89             5           3            4           1 versicolor
#> 90             5           2            4           1 versicolor
#> 91             5           2            4           1 versicolor
#> 92             6           3            4           1 versicolor
#> 93             5           2            4           1 versicolor
#> 94             5           2            3           1 versicolor
#> 95             5           2            4           1 versicolor
#> 96             5           3            4           1 versicolor
#> 97             5           2            4           1 versicolor
#> 98             6           2            4           1 versicolor
#> 99             5           2            3           1 versicolor
#> 100            5           2            4           1 versicolor
#> 101            6           3            6           2  virginica
#> 102            5           2            5           1  virginica
#> 103            7           3            5           2  virginica
#> 104            6           2            5           1  virginica
#> 105            6           3            5           2  virginica
#> 106            7           3            6           2  virginica
#> 107            4           2            4           1  virginica
#> 108            7           2            6           1  virginica
#> 109            6           2            5           1  virginica
#> 110            7           3            6           2  virginica
#> 111            6           3            5           2  virginica
#> 112            6           2            5           1  virginica
#> 113            6           3            5           2  virginica
#> 114            5           2            5           2  virginica
#> 115            5           2            5           2  virginica
#> 116            6           3            5           2  virginica
#> 117            6           3            5           1  virginica
#> 118            7           3            6           2  virginica
#> 119            7           2            6           2  virginica
#> 120            6           2            5           1  virginica
#> 121            6           3            5           2  virginica
#> 122            5           2            4           2  virginica
#> 123            7           2            6           2  virginica
#> 124            6           2            4           1  virginica
#> 125            6           3            5           2  virginica
#> 126            7           3            6           1  virginica
#> 127            6           2            4           1  virginica
#> 128            6           3            4           1  virginica
#> 129            6           2            5           2  virginica
#> 130            7           3            5           1  virginica
#> 131            7           2            6           1  virginica
#> 132            7           3            6           2  virginica
#> 133            6           2            5           2  virginica
#> 134            6           2            5           1  virginica
#> 135            6           2            5           1  virginica
#> 136            7           3            6           2  virginica
#> 137            6           3            5           2  virginica
#> 138            6           3            5           1  virginica
#> 139            6           3            4           1  virginica
#> 140            6           3            5           2  virginica
#> 141            6           3            5           2  virginica
#> 142            6           3            5           2  virginica
#> 143            5           2            5           1  virginica
#> 144            6           3            5           2  virginica
#> 145            6           3            5           2  virginica
#> 146            6           3            5           2  virginica
#> 147            6           2            5           1  virginica
#> 148            6           3            5           2  virginica
#> 149            6           3            5           2  virginica
#> 150            5           3            5           1  virginica
源代码:R/modify.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Modify elements selectively。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。