将NA替换为另一列选择的值

时间:2019-04-02 10:40:52

标签: r

第一列中有一个缺少值的表格。 第一和第二列之间有关系,即 第一列中有一个唯一的名称,对应于第二列中的许多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和数据表的不同方法之间陷入了困境,无法取得任何进展。 关于我如何继续前进的任何想法? 谢谢。

2 个答案:

答案 0 :(得分:1)

这是一个<div class="modal-header"> <button type="button" class="close" data-dismiss="modal">x</button> </div> <div class="modal-body"> <div id="map"></div> </div> <div class="modal-footer"> </div> 解决方案:

$("#map_modal").find(".modal-content").html("<%= j (render 'map_modal', locals: { account: @account }) %>");
$("#map_modal").modal();

$('#map_modal').on('shown.bs.modal', function (e) {
    handler = Gmaps.build('Google');
    handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){
        markers = handler.addMarkers(<%=raw @hash.to_json %>);
        handler.bounds.extendWith(markers);
        handler.fitMapToBounds();
        handler.getMap().setZoom(12);
    });
});

注意: 这也将与因子变量一起使用。 对于您发布的特定示例,您实际上并不需要dplyr,但这是一个更一般的情况(即,如果您有多个行用于特定的ID和非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 NAME值)。

答案 1 :(得分:0)

首先,您必须以某种方式将数据输入R。此过程超出了答案的范围。

temp
#    NAME  ID Value
# 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  <NA> ID3    V7
# 8  <NA> ID1    V8
# 9  <NA> ID5    V9
# 10 <NA> ID4   V10
# 11 <NA> ID5   V11

以下解决方案不使用dplyr,仅使用带有do.call的基本R。

temp2 <- table (temp$NAME, temp$ID)
temp2

#    ID1 ID2 ID3 ID4 ID5 ID6
#  A   1   1   1   0   0   0
#  B   0   0   0   1   0   0
#  C   0   0   0   0   1   1

您不能直接使用该表。首先,必须将其转换为数据框。

temp3 <- as.data.frame.matrix(temp2)
temp3

#    ID1 ID2 ID3 ID4 ID5 ID6
# A   1   1   1   0   0   0
# B   0   0   0   1   0   0
# C   0   0   0   0   1   1

例如,您要将ID5对应的NA替换为“ C”。

rownames (temp3[which(temp3$ID5 == 1),])
# [1] "C"

现在让我们将其放入函数中。

returnName <- function (df, id)
{
    rowTemp <- do.call ('$', list(df, id))
    name <- rownames (df[which(rowTemp == 1),])
    return (name)
}

temp$NAME <- sapply (temp$ID, returnName, df = temp3)

temp
#    NAME  ID Value
# 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