Почему я не могу заменить значение в объединенном фрейме данных? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть два dataframes следующим образом:

df1 <- read.table(text = "Source    Signal  Target
A   no  B
B   yes C
C   no  D
D   no  A
E   yes F
F   yes G
G   no  E", header = T)

df2 <- read.table(text = "Source    Signal  Target
A   no  B
B   yes C
E   yes F
F   yes G", header = T)

Я объединил df1 и df2: interactions <- merge(df1, df2), а затем я пытаюсь match каждый Source и Target с df3.

df3 <- read.table(text = "Symbol    ID  Name
A   11  LetterA
C   13  LetterC
D   14  LetterD
F   16  LetterF
G   17  LetterG", header = T)

И я получаю следующий вывод:

Source
     Symbol   ID    Name
1         A   11    LetterA
NA     <NA>   NA    <NA>
NA.1   <NA>   NA    <NA>
4         F   16    LetterF

Так что я хочу replace NA с «оригиналом»ввод отображается в df2 и получается вывод следующим образом:

Symbol  ID   Name
  A     11   LetterA
  B     NA   B
  E     NA   E
  F     16   LetterF

Я пытался с помощью:

Source <- df3[match(interactions$Source, df3$Symbol),-4]
my.na <- is.na(Source$Name)
Source$Name[my.na] <- interactions$Source[my.na]
Source$Symbol[my.na] <- interactions$Source[my.na]

Но я получаю числа вместо символов.Есть ли что-то, что мне не хватает?Можно ли заменить объединенное значение без использования какой-либо библиотеки?

1 Ответ

0 голосов
/ 14 мая 2018

Ваша проблема в том, что по умолчанию read.table преобразует строки в факторы, которые хранятся в виде целых чисел, которые сопоставляются с таблицей поиска. Поэтому, когда вы пытаетесь вставить их в Source, на самом деле вставляется целочисленное значение для этого фактора. Вы можете обойти это, добавив аргумент: stringsAsFactors = F к вашим read.table вызовам, чтобы данные там сохранялись в виде строк. Теперь, когда вы используете match для вставки значений в Source, будут вставлены строки, а не числа факторов.

Если у вас все еще есть проблемы, вам также может потребоваться преобразовать переменные в Source в символ, а не в коэффициент. Вы можете сделать это:

# Base R:
Source$Symbol <- as.character(Source$Symbol)
Source$Name <- as.character(Source$Name)

# Dplyr:
library(dplyr)
Source <- Source %>%
    mutate_if(is.factor, as.character)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...