【发布时间】:2021-03-11 05:19:21
【问题描述】:
我有一个由 id-name 对组成的数据集。这些对可以出现多次。在某些行中缺少 name 列中的值,在其他行中缺少 id:
id_name = data.table(stringsAsFactors=FALSE,
id = c("x123", "xy234","x123",NA,"z123","y123","d654","d654"),
name = c("john", "mary", NA,"mary","bob","bob", "john",NA)
)
我想仅将一列中的 NA 值替换为另一行中的(非缺失)值,并使用另一列作为查找值。结果应该是:
id name
1: x123 john
2: xy234 mary
3: x123 john
4: xy234 mary
5: z123 bob
6: y123 bob
7: d654 john
8: d654 john
实现这一点的惯用方式是什么,data.table 方式?以下仅更新名称列的方法不会产生错误,但也不会更新数据集:
id_name[is.na(name)][id_name[!is.na(name)], on="id", name:=i.name]
> id_name
id name
1: x123 john
2: xy234 mary
3: x123 <NA>
4: <NA> mary
5: z123 bob
6: y123 bob
7: d654 john
8: d654 <NA>
但是,没有更新的只是子集并加入:
id_name[is.na(name)][id_name[!is.na(name)], on="id",nomatch=0L]
id name i.name
1: x123 <NA> john
2: d654 <NA> john
更新
更新了 MRE 以明确某些名称可以与 2 个 ID 相关联。两个 id 都必须保留。
【问题讨论】:
标签: r join replace data.table subset