Получение R ошибки «замена имеет x строк, данные имеют y» при создании нового логического столбца в кадре данных на основе совпадений с другим кадром данных - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть два следующих кадра данных (упрощенный для вопроса):

nsPre (меньший кадр данных):

gene_id_name
ENSG00000005020|SKAP2
ENSG00000017260|ATP2C1
ENSG00000027869|SH2D2A
ENSG00000039319|ZFYVE16
.
.
.

g0 (больший размер данных):

gene_id_name            pLI       g_eGenes_general
ENSG00000005020|SKAP2   0.00823   0
ENSG00000039319|ZFYVE16 0.12104   0
ENSG00000087884|AAMDC   0.13539   1
ENSG00000027869|SH2D2A  0.002489  1
ENSG00000124608|AARS2   0.32500   0
.
.
.

Я пытаюсь создать в g0 новый столбец с именем g_eGenes_nsPre, который присваивает значение 1 при совпадении значений gene_id_name, изначение 0, когда они этого не делают, как показано ниже:

Желаемый результат:

gene_id_name            pLI      g_eGenes_general   g_eGenes_nsPre
ENSG00000005020|SKAP2   0.00823  0                  1
ENSG00000039319|ZFYVE16 0.12104  0                  1
ENSG00000087884|AAMDC   0.13539  1                  0
ENSG00000027869|SH2D2A  0.002489 1                  1
ENSG00000124608|AARS2   0.32500  0                  0

Текущая попытка:

df = g0
df <- na.omit(df)    
df$g_eGenes_nsPre <- ifelse(nsPre$gene_id_name %in% g0$gene_id_name, 1, 0)
df$g_eGenes_nsPost <- ifelse(nsPost$gene_id_name %in% g0$gene_id_name, 1, 0)

Ошибка при работе над кодом:

Error in `$<-.data.frame`(`*tmp*`, g_eGenes_nsPre, value = c(1, 1, 1,  : 
  replacement has 2039 rows, data has 15430

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Это простой oneliner, использующий data.table: сначала создайте столбец g_eGenes_nsPre со всеми нулями, затем измените значения на значения для строк, которые gene_id_names находятся в другом data.frame.

library(data.table)
setDT(g0); setDT(nsPre)
g0[,g_eGenes_nsPre:=0][gene_id_name%in%nsPre$gene_id_name,g_eGenes_nsPre:=1]
0 голосов
/ 04 декабря 2018

В базе R

transform(g0, g_eGenes_nsPre = apply(g0, 1, function(x)
    as.integer(x["gene_id_name"] %in% nsPre$gene_id_name)))
#             gene_id_name      pLI g_eGenes_general g_eGenes_nsPre
#1   ENSG00000005020|SKAP2 0.008230                0              1
#2 ENSG00000039319|ZFYVE16 0.121040                0              1
#3   ENSG00000087884|AAMDC 0.135390                1              0
#4  ENSG00000027869|SH2D2A 0.002489                1              1
#5   ENSG00000124608|AARS2 0.325000                0              0

Инстрад as.integer вы также можете использовать одинарный оператор +.

Или использовать dplyr

library(dplyr)
g0 %>%
    mutate(g_eGenes_nsPre = +(gene_id_name %in% nsPre$gene_id_name))
#             gene_id_name      pLI g_eGenes_general g_eGenes_nsPre
#1   ENSG00000005020|SKAP2 0.008230                0              1
#2 ENSG00000039319|ZFYVE16 0.121040                0              1
#3   ENSG00000087884|AAMDC 0.135390                1              0
#4  ENSG00000027869|SH2D2A 0.002489                1              1
#5   ENSG00000124608|AARS2 0.325000                0              0

Или используя data.table

library(data.table)
setDT(g0)[, g_eGenes_nsPre := +(gene_id_name %in% nsPre$gene_id_name)]

Пример данных

nsPre <- read.table(text =
    "gene_id_name
ENSG00000005020|SKAP2
ENSG00000017260|ATP2C1
ENSG00000027869|SH2D2A
ENSG00000039319|ZFYVE16", header = T)

g0 <- read.table(text =
    "gene_id_name            pLI       g_eGenes_general
ENSG00000005020|SKAP2   0.00823   0
ENSG00000039319|ZFYVE16 0.12104   0
ENSG00000087884|AAMDC   0.13539   1
ENSG00000027869|SH2D2A  0.002489  1
ENSG00000124608|AARS2   0.32500   0", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...