Замените NA на значения, выбранные другим столбцом - PullRequest
1 голос
/ 02 апреля 2019

У меня есть таблица с пропущенными значениями в первом столбце.Существует связь между первым и вторым столбцом, а именно: В первом столбце есть уникальное ИМЯ, соответствующее множеству идентификаторов во втором столбце.

Например:

  • A имеет (ID1, ID2, ID3)
  • B имеет (ID4)
  • C имеет (ID5, ID6)

NA в столбце NAME необходимо заменить одним из существующих значений в его столбце (A или B или C).Выбор осуществляется по его идентификатору из второго столбца.Например, первый 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 ]

1 голос
/ 02 апреля 2019

Вот решение 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(.), но это более общий случай (т. Е. Если у вас есть несколько строк для определенного идентификатора и не NA NAME).

0 голосов
/ 02 апреля 2019

Во-первых, вы должны как-то передать свои данные в 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, только базовый R с do.call.

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

Например, вы хотите заменить NA, соответствующий ID5, на «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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...