r - 用另一列选择的值替换 NA
问题描述
我有一个第一列中缺少值的表。第一列和第二列之间存在关系,即第一列有一个唯一的NAME,对应第二列中的许多ID。
例如:
- A 有 (ID1, ID2, ID3)
- B 有 (ID4)
- C 有 (ID5, ID6)
NAME 列中的 NA 需要替换为其列中的现有值之一(A 或 B 或 C)。选择是通过第二列中的 ID 完成的。例如,第一个 NA 具有 ID3。在表中查找,ID3 对应于 A,因此,NA 将替换为 A。
第三列在这一步没有任何作用,但我在接下来的操作中也需要它。
这是它目前的外观:
NAME | ID | Value
A | ID1 | V1
A | ID2 | V2
A | ID3 | V3
B | ID4 | V4
C | ID5 | V5
C | ID6 | V6
NA | ID3 | V7
NA | ID1 | V8
NA | ID5 | V9
NA | ID4 | V10
NA | ID5 | V11
这就是它的样子
Name | ID | Value
A | ID1 | V1
A | ID2 | V2
A | ID3 | V3
B | ID4 | V4
C | ID5 | V5
C | ID6 | V6
A | ID3 | V7
A | ID1 | V8
C | ID5 | V9
B | ID4 | V10
C | ID5 | V11
我陷入了使用 dplyr 和数据表的不同方法之间,无法取得任何进展。知道如何继续前进吗?谢谢你。
解决方案
这是一个dplyr
解决方案:
library(dplyr)
# example data
dt = read.table(text = "
NAME ID Value
A ID1 V1
A ID2 V2
A ID3 V3
B ID4 V4
C ID5 V5
C ID6 V6
NA ID3 V7
NA ID1 V8
NA ID5 V9
NA ID4 V10
NA ID5 V11
", header=T, stringsAsFactors=F)
dt %>%
group_by(ID) %>% # for each ID
mutate(NAME = unique(NAME[!is.na(NAME)])) %>% # get the non-NA value of NAME
ungroup() # forget the grouping
# # A tibble: 11 x 3
# NAME ID Value
# <chr> <chr> <chr>
# 1 A ID1 V1
# 2 A ID2 V2
# 3 A ID3 V3
# 4 B ID4 V4
# 5 C ID5 V5
# 6 C ID6 V6
# 7 A ID3 V7
# 8 A ID1 V8
# 9 C ID5 V9
#10 B ID4 V10
#11 C ID5 V11
注意:这也适用于因子变量。对于您发布的特定示例,您并不真正需要unique(.)
,但这是更一般的情况(即,如果您有多个行用于特定 ID 和非NA
NAME 值)。
推荐阅读
- excel - 谷歌电子表格是否具有获取当前活动单元格的行/列的功能?
- r - 代码覆盖在 if 语句条件上为绿色,但在其表达式上为红色。为什么?
- python - 如何根据用户输入发送嵌入
- javascript - 他们有更简单的方法来定义行[0]吗?
- javascript - 在谷歌应用脚本中触发 doPost 时如何在 html 前端进行更改
- reactjs - 三元运算返回相同的结果而不评估条件
- javascript - 迭代数字数组以使用给定算法计算所有可能的组合 - javscript
- python - 如何装饰父属性的 getter 或 setter?
- android - W/FLTFireMsgService(8777):Flutter-FCM 无法在 Dart 中处理后台消息
- c - 创建过滤器 ffmpeg 过滤器时,我得到 ar: libavfilter/foobar.o: No such file or directory