#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]