Я пытаюсь создать новую переменную в моем фрейме данных, которая возвращает имя переменной, для которой выполняется условие, однако у меня также есть переменная chr в наборе данных, поэтому необходимо применить какую-то числовую оболочку.
Набор данных до:
ChrV | V1 | V2 | V3
Obs 1 | chr1 | <b>0.65</b> | 0.30 | 0.40
Obs 2 | chr2 | 0.35 | <b>0.75</b> | 0.42
Obs 3 | chr3 | 0.10 | 0.43 | <b>0.80</b>
Мое решение:
Сохранить переменную chr.
ChrV <- ds$ChrV
Удалить переменную chr из набора данных (альтернатива числовой оболочке)
ds$ChrV <- NULL
Создать новый столбец - применить ко всем строкам набора данных: функция - вставить имена столбцов, для которых абсолютное значение x больше или равно 0,5.
ds$V4 <- apply(ds, 1, function(x) paste(names(which(abs(x) >= 0.5))))
Привязать переменную chr к набору данных.
ds <- cbind(ChrV, ds)
Выход:
ChrV | V1 | V2 | V2 | V4
Obs 1 | chr1 | <b>0.65</b> | 0.30 | 0.40 | <b>Var 1</b>
Obs 2 | chr2 | 0.35 | <b>0.75</b> | 0.42 | <b>Var 2</b>
Obs 3 | chr3 | 0.10 | 0.43 | <b>0.80</b> | <b>Var 3</b>
Моя проблема:
Хотя мое решение работает, мне нужно найти более элегантное решение, которое игнорирует переменную chr (поэтому оно учитывает только числовые переменные, и мне не нужно удалять переменные и связывать их позже), и это также применимо к любому набору данных независимо от количества столбцов и строк.
dput (DS)
structure(list(
ChrV = c("chr1", "chr2", "chr3"),
V1 = c(3, 2, 1),
V2 = c(1, 3, 2),
V3 = c(1, 2, 3)),
row.names = c(NA, -6L),
class = c("data.table", "data.frame"),
.internal.selfref = <pointer: 0x0000000002541ef0>)