Подтвердить что ты не робот

R - Как сделать подмножество столбцов на основе значений в строке в кадре данных

У меня есть матрица, которую я хотел бы подмножить и в конечном итоге использовать для создания сюжета. Данные представляют собой список подсчетов для конкретных маркеров крови для каждого пациента в популяции. Это выглядит так:

    df <- data.frame(MarkerID=c("Class","A123","A124"),
             MarkerName=c("","X","Y"),
             Patient.1=c(0,1,5),
             Patent.2=c(1,2,6),
             Patent.3=c(0,3,7),
             Patient.4=c(1,4,8))

Я хотел бы создать кадр данных всех пациентов (столбцы 3-6), которые имеют значение класса нуль (1-я строка) и второй кадр данных всех пациентов с классом 1.

В прошлом я использовал функцию подмножества для выбора строк на основе значений в столбце, можно ли выбрать поднабор столбцов на основе значений в строке?

Я пробовал это:

x <- subset(data, data[1,] == 0)

однако, когда я делаю dim(x), число столбцов совпадает с числом dim(data), но количество строк отличается. Любые идеи о том, как я могу это сделать, возвращают только те столбцы, значение которых в строке 1 равно 0?

Roland, Да. Пример df - это то, как выглядит кадр данных. В рамке данных есть ~ 30 000 маркеров и > 400 пациентов, поэтому я не опубликовал dput(head(data)). Спасибо за реконфигурирующий наконечник, я попробую попробовать.

Ваш примерный код работал для подмножества столбцов на основе строк

data[,c(TRUE,TRUE,data[1,-(1:2)]==1)]

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

4b9b3361

Ответ 1

Ваши данные не организованы в хорошем смысле. Было бы лучше переделать его.

В отсутствие входных данных это просто предположение:

df <- data.frame(MarkerID=c("Class","A123","A124"),
                 MarkerName=c("","X","Y"),
                 Patient.1=c(0,1,5),
                 Patent.2=c(1,2,6),
                 Patent.3=c(0,3,7),
                 Patient.4=c(1,4,8))

#  MarkerID MarkerName Patient.1 Patent.2 Patent.3 Patient.4
#1    Class                    0        1        0         1
#2     A123          X         1        2        3         4
#3     A124          Y         5        6        7         8

df[,c(TRUE,TRUE,df[1,-(1:2)]==0)]

#  MarkerID MarkerName Patient.1 Patent.3
#1    Class                    0        0
#2     A123          X         1        3
#3     A124          Y         5        7

Здесь c(TRUE,TRUE,df[1,-(1:2)]==0) создается логический вектор, который является TRUE для первых двух столбцов и для тех столбцов, которые имеют 0 в первой строке. Затем я подмножаю столбцы на основе этого вектора.

df[,c(TRUE,TRUE,df[1,-(1:2)]==1)]

#  MarkerID MarkerName Patent.2 Patient.4
#1    Class                   1         1
#2     A123          X        2         4
#3     A124          Y        6         8

Это изменит ваши данные на более общий формат (для статистического программного обеспечения):

library(reshape2)  
df2 <- merge(melt(df[1,],variable.name="Patient",value.name="class")[-(1:2)],
             melt(df[-1,],variable.name="Patient"),all=TRUE)

#    Patient class MarkerID MarkerName value
#1  Patent.2     1     A123          X     2
#2  Patent.2     1     A124          Y     6
#3  Patent.3     0     A123          X     3
#4  Patent.3     0     A124          Y     7
#5 Patient.1     0     A123          X     1
#6 Patient.1     0     A124          Y     5
#7 Patient.4     1     A123          X     4
#8 Patient.4     1     A124          Y     8

Затем вы можете использовать subset:

subset(df2,class==0)

#    Patient class MarkerID MarkerName value
#3  Patent.3     0     A123          X     3
#4  Patent.3     0     A124          Y     7
#5 Patient.1     0     A123          X     1
#6 Patient.1     0     A124          Y     5