Как мне подмножить фрейм данных на основе значений в другом фрейме данных?

#r

#r

Вопрос:

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

 > dat
             GSM27015.26.M GSM27016.26.M GSM27018.29.M GSM27021.37.M GSM27023.40.M GSM27024.42.M
31307_at       179.86300    106.495000     265.58600     301.24300     218.50900     224.61000
31308_at       559.07800    411.483000     481.17600     570.73300     333.53900     370.07900
31309_r_at      20.76970     30.641500      50.21530      42.68920      27.10590      21.57620
31310_at       154.19100    224.446000     188.82300     177.86300     233.46300     120.90800
31311_at       956.79700    648.310000     933.65600    1016.41000     762.01300    1040.29000
  

И файл аннотации с возрастом пациентов

 > ann
          Gender Age
GSM27015      M  26
GSM27016      M  26
GSM27018      M  29
GSM27021      M  37
GSM27023      M  40
GSM27024      M  42
GSM27025      M  45
GSM27027      M  52
GSM27028      M  53
  

Ответ №1:

Вот еще кое-что, что нужно учитывать.

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

 dat_new <- cbind(do.call(rbind, strsplit(colnames(dat), '\.')), as.data.frame(t(dat)))
colnames(dat_new)[1:3] <- c("id", "age", "gender")
rownames(dat_new) <- NULL
  

Вот как это будет выглядеть:

         id age gender 31307_at 31308_at 31309_r_at 31310_at 31311_at
1 GSM27015  26      M  179.863  559.078    20.7697  154.191  956.797
2 GSM27016  26      M  106.495  411.483    30.6415  224.446  648.310
3 GSM27018  29      M  265.586  481.176    50.2153  188.823  933.656
4 GSM27021  37      M  301.243  570.733    42.6892  177.863 1016.410
5 GSM27023  40      M  218.509  333.539    27.1059  233.463  762.013
6 GSM27024  42      M  224.610  370.079    21.5762  120.908 1040.290
  

Затем, если вы хотите подмножество на основе возраста (например, <= 50 лет), вы можете сделать:

 dat_new[dat_new$age <= 50, ]
  

Ответ №2:

Возможно, попробуйте

 dat[as.numeric(gsub(".*?\.(\d )\..*","\1",names(dat)))<50]
  

Ответ №3:

Работает ли это:

 > library(dplyr)
> data
           GSM27015.26.M GSM27016.26.M GSM27018.29.M GSM27021.37.M GSM27023.40.M GSM27024.42.M GSM27024.52.M
31307_at        179.8630      106.4950      265.5860      301.2430      218.5090      224.6100       331.230
31308_at        559.0780      411.4830      481.1760      570.7330      333.5390      370.0790       370.079
31309_r_at       20.7697       30.6415       50.2153       42.6892       27.1059       21.5762     98998.000
31310_at        154.1910      224.4460      188.8230      177.8630      233.4630      120.9080       120.908
31311_at        956.7970      648.3100      933.6560     1016.4100      762.0130     1040.2900      1000.290
> data %>% select_if(as.numeric(gsub('GSM\d{5}\.(\d{2})..','\1',names(data))) < 50)
           GSM27015.26.M GSM27016.26.M GSM27018.29.M GSM27021.37.M GSM27023.40.M GSM27024.42.M
31307_at        179.8630      106.4950      265.5860      301.2430      218.5090      224.6100
31308_at        559.0780      411.4830      481.1760      570.7330      333.5390      370.0790
31309_r_at       20.7697       30.6415       50.2153       42.6892       27.1059       21.5762
31310_at        154.1910      224.4460      188.8230      177.8630      233.4630      120.9080
31311_at        956.7970      648.3100      933.6560     1016.4100      762.0130     1040.2900
> 
  

Итак, я добавил еще один столбец к вашим данным «GSM27024.52.M», и в выводе выбора он не был выбран.

Ответ №4:

Опция с parse_number

 library(stringr)
dat[readr::parse_number(str_remove(names(dat), "^[^.] \.")) < 50]