这些函数提供了使用第二个数据表修改表中的行的框架。这两个表与 by
一组关键变量相匹配,这些变量的值通常唯一标识每一行。这些函数的灵感来自 SQL 的 INSERT
、 UPDATE
和 DELETE
,并且可以选择针对选定的后端修改 in_place
。
-
rows_insert()
添加新行(如INSERT
)。默认情况下,y
中的键值不能存在于x
中。 -
rows_append()
的工作方式与rows_insert()
类似,但忽略键。 -
rows_update()
修改现有行(如UPDATE
)。y
中的键值必须是唯一的,并且默认情况下,y
中的键值必须存在于x
中。 -
rows_patch()
的工作方式与rows_update()
类似,但仅覆盖NA
值。 -
rows_upsert()
根据y
中的键值是否已存在于x
中进行插入或更新。y
中的键值必须是唯一的。 -
rows_delete()
删除行(如DELETE
)。默认情况下,y
中的键值必须存在于x
中。
用法
rows_insert(
x,
y,
by = NULL,
...,
conflict = c("error", "ignore"),
copy = FALSE,
in_place = FALSE
)
rows_append(x, y, ..., copy = FALSE, in_place = FALSE)
rows_update(
x,
y,
by = NULL,
...,
unmatched = c("error", "ignore"),
copy = FALSE,
in_place = FALSE
)
rows_patch(
x,
y,
by = NULL,
...,
unmatched = c("error", "ignore"),
copy = FALSE,
in_place = FALSE
)
rows_upsert(x, y, by = NULL, ..., copy = FALSE, in_place = FALSE)
rows_delete(
x,
y,
by = NULL,
...,
unmatched = c("error", "ignore"),
copy = FALSE,
in_place = FALSE
)
参数
- x, y
-
一对数据帧或数据帧扩展(例如 tibble)。
y
必须与x
具有相同的列或子集。 - by
-
给出关键列的未命名字符向量。键列必须同时存在于
x
和y
中。键通常唯一标识每一行,但这仅在使用rows_update()
、rows_patch()
或rows_upsert()
时对y
的键值强制执行。默认情况下,我们使用
y
中的第一列,因为第一列是放置标识符变量的合理位置。 - ...
-
传递给方法的其他参数。
- conflict
-
对于
rows_insert()
,y
中的键与x
中的键冲突应该如何处理?如果y
中的键已存在于x
中,则会发生冲突。之一:
-
"error"
(默认值)如果y
中的任何键与x
中的键冲突,将会出错。 -
"ignore"
将忽略y
中与x
中的键冲突的行。
-
- copy
-
如果
x
和y
不是来自同一个数据源,并且copy
是TRUE
,则y
将被复制到与x
相同的源中。这允许您跨 src 连接表,但这是一项潜在昂贵的操作,因此您必须选择它。 - in_place
-
是否应该就地修改
x
?此参数仅与可变后端相关(例如数据库、data.tables)。当
TRUE
时,隐形返回x
的修改版本;当FALSE
时,返回一个表示结果更改的新对象。 - unmatched
-
对于
rows_update()
、rows_patch()
和rows_delete()
,应如何处理y
中与x
中的键不匹配的键?之一:
-
"error"
(默认值)如果y
中的任何键与x
中的键不匹配,则会出错。 -
"ignore"
将忽略y
中的行,这些行的键与x
中的键不匹配。
-
值
与 x
类型相同的对象。 x
的行和列的顺序
被尽可能地保留下来。输出具有以下属性:
-
rows_update()
和rows_patch()
保留行数;rows_insert()
、rows_append()
和rows_upsert()
返回所有现有行和可能的新行;rows_delete()
返回行的子集。 -
尽管数据可能会更新,但不会添加、删除或重新定位列。
-
组取自
x
。 -
数据帧属性取自
x
。
如果是 in_place = TRUE
,结果会以不可见的方式返回。
方法
这些函数是泛型函数,这意味着包可以为其他类提供实现(方法)。有关额外参数和行为差异,请参阅各个方法的文档。
当前加载的包中可用的方法:
-
rows_insert()
:dbplyr(tbl_lazy
)、dplyr(data.frame
)。 -
rows_append()
:dbplyr(tbl_lazy
)、dplyr(data.frame
)。 -
rows_update()
:dbplyr(tbl_lazy
)、dplyr(data.frame
)。 -
rows_patch()
:dbplyr(tbl_lazy
)、dplyr(data.frame
)。 -
rows_upsert()
:dbplyr(tbl_lazy
)、dplyr(data.frame
)。 -
rows_delete()
:dbplyr(tbl_lazy
)、dplyr(data.frame
)。
例子
data <- tibble(a = 1:3, b = letters[c(1:2, NA)], c = 0.5 + 0:2)
data
#> # A tibble: 3 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 b 1.5
#> 3 3 NA 2.5
# Insert
rows_insert(data, tibble(a = 4, b = "z"))
#> Matching, by = "a"
#> # A tibble: 4 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 b 1.5
#> 3 3 NA 2.5
#> 4 4 z NA
# By default, if a key in `y` matches a key in `x`, then it can't be inserted
# and will throw an error. Alternatively, you can ignore rows in `y`
# containing keys that conflict with keys in `x` with `conflict = "ignore"`,
# or you can use `rows_append()` to ignore keys entirely.
try(rows_insert(data, tibble(a = 3, b = "z")))
#> Matching, by = "a"
#> Error in rows_insert(data, tibble(a = 3, b = "z")) :
#> `y` can't contain keys that already exist in `x`.
#> ℹ The following rows in `y` have keys that already exist in `x`: `c(1)`.
#> ℹ Use `conflict = "ignore"` if you want to ignore these `y` rows.
rows_insert(data, tibble(a = 3, b = "z"), conflict = "ignore")
#> Matching, by = "a"
#> # A tibble: 3 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 b 1.5
#> 3 3 NA 2.5
rows_append(data, tibble(a = 3, b = "z"))
#> # A tibble: 4 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 b 1.5
#> 3 3 NA 2.5
#> 4 3 z NA
# Update
rows_update(data, tibble(a = 2:3, b = "z"))
#> Matching, by = "a"
#> # A tibble: 3 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 z 1.5
#> 3 3 z 2.5
rows_update(data, tibble(b = "z", a = 2:3), by = "a")
#> # A tibble: 3 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 z 1.5
#> 3 3 z 2.5
# Variants: patch and upsert
rows_patch(data, tibble(a = 2:3, b = "z"))
#> Matching, by = "a"
#> # A tibble: 3 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 b 1.5
#> 3 3 z 2.5
rows_upsert(data, tibble(a = 2:4, b = "z"))
#> Matching, by = "a"
#> # A tibble: 4 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 z 1.5
#> 3 3 z 2.5
#> 4 4 z NA
# Delete and truncate
rows_delete(data, tibble(a = 2:3))
#> Matching, by = "a"
#> # A tibble: 1 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
rows_delete(data, tibble(a = 2:3, b = "b"))
#> Matching, by = "a"
#> Ignoring extra `y` columns: b
#> # A tibble: 1 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
# By default, for update, patch, and delete it is an error if a key in `y`
# doesn't exist in `x`. You can ignore rows in `y` that have unmatched keys
# with `unmatched = "ignore"`.
y <- tibble(a = 3:4, b = "z")
try(rows_update(data, y, by = "a"))
#> Error in rows_update(data, y, by = "a") :
#> `y` must contain keys that already exist in `x`.
#> ℹ The following rows in `y` have keys that don't exist in `x`: `c(2)`.
#> ℹ Use `unmatched = "ignore"` if you want to ignore these `y` rows.
rows_update(data, y, by = "a", unmatched = "ignore")
#> # A tibble: 3 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 b 1.5
#> 3 3 z 2.5
rows_patch(data, y, by = "a", unmatched = "ignore")
#> # A tibble: 3 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 b 1.5
#> 3 3 z 2.5
rows_delete(data, y, by = "a", unmatched = "ignore")
#> Ignoring extra `y` columns: b
#> # A tibble: 2 × 3
#> a b c
#> <int> <chr> <dbl>
#> 1 1 a 0.5
#> 2 2 b 1.5
相关用法
- R dplyr row_number 整数排名函数
- R dplyr rowwise 按行对输入进行分组
- R dplyr recode 重新编码值
- R dplyr rename 重命名列
- R dplyr relocate 更改列顺序
- R dplyr reframe 将每个组转换为任意数量的行
- R dplyr group_trim 修剪分组结构
- R dplyr slice 使用行的位置对行进行子集化
- R dplyr copy_to 将本地数据帧复制到远程src
- R dplyr sample_n 从表中采样 n 行
- R dplyr consecutive_id 为连续组合生成唯一标识符
- R dplyr band_members 乐队成员
- R dplyr mutate-joins 变异连接
- R dplyr nth 从向量中提取第一个、最后一个或第 n 个值
- R dplyr coalesce 找到第一个非缺失元素
- R dplyr group_split 按组分割 DataFrame
- R dplyr mutate 创建、修改和删除列
- R dplyr order_by 用于排序窗口函数输出的辅助函数
- R dplyr context 有关“当前”组或变量的信息
- R dplyr percent_rank 比例排名函数
- R dplyr starwars 星球大战人物
- R dplyr desc 降序
- R dplyr between 检测值落在指定范围内的位置
- R dplyr cumall 任何、全部和平均值的累积版本
- R dplyr group_map 对每个组应用一个函数
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Manipulate individual rows。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。