首页 > 解决方案 > 用另一列选择的值替换 NA

问题描述

我有一个第一列中缺少值的表。第一列和第二列之间存在关系,即第一列有一个唯一的NAME,对应第二列中的许多ID。

例如:

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 和数据表的不同方法之间,无法取得任何进展。知道如何继续前进吗?谢谢你。

标签: r

解决方案


这是一个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 和非NANAME 值)。


推荐阅读