Есть ли способ использовать is.na в R со ссылками на номера столбцов? - PullRequest
0 голосов
/ 27 июня 2019

Я создаю пакет R в биоинформатике, и у меня есть таблица данных, в которой одно из имен столбцов является переменным, оно будет основано на входных геномных данных. У меня есть строка с условным условием, где мне нужно два условия: один столбец в строке - NA, а другой столбец больше, чем какое-то число, которое даст пользователь.

Я пытался использовать is.na () с чем-то вроде mergeframe_dt [, 2], где я указываю столбец #, а не типичное имя столбца.

Как правило, что-то вроде этого будет работать:

mergeframe_dt[is.na(new)&Reads>5, new := factor(0)]

Но проблема в том, что имя нового столбца является переменным, оно будет разным в каждом случае. Ранее в моем коде я в основном установил имя геномного файла, который пользователь будет вводить.

В идеале я хочу что-то, что работает следующим образом, где он проверяет, является ли второй столбец таблицы данных mergeframe_dt NA и если столбец «Reads» больше 5.

mergeframe_dt<-as.data.table(mergeframe)
mergeframe_dt[is.na(mergeframe_dt[,2])&Reads>5, new := factor(0)]

Я тоже пробовал это, но оно также не работало:

mergeframe_dt[is.na(mergeframe_dt$(colnames(mergeframe_dt)[2]))&Reads>5, new := factor(0)]

Ошибка: Пример 1:

Error in `[.data.table`(mergeframe_dt, is.na(mergeframe_dt[, 2]) & Reads >  : 
  i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). Please report to data.table issue tracker if you'd like this, or add your comments to FR #657.

Пример 2:

Error: unexpected '(' in "mergeframe_dt[is.na(mergeframe_dt$("

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Используя только базу R, вы можете сделать что-то вроде этого:

library(data.table)

DT <- data.table(var = as.factor(c(1, NA, NA, 2)),
                 Reads = 4:7)

new <- "var"

expr <- substitute(DT[is.na(var_name) & Reads > 5, var_name := factor(0)],
                   list(var_name = as.name(new)))

eval(expr)

print(DT)
    var Reads
1:    1     4
2: <NA>     5
3:    0     6
4:    2     7
0 голосов
/ 28 июня 2019

Идиоматическим способом является использование .I

mergeframe_dt <- data.table(new=c(1,NA), Reads=c(1,6))
v <- "new"
mergeframe_dt[mergeframe_dt[, .I[is.na(get(v)) & Reads > 5]], (v) := 0L]

Я ожидаю, что ..v также будет работать вместо get(v), возможно, мое понимание .. неверно.

...