#r
#r
Вопрос:
У меня очень большой набор данных, в котором я хочу взять столбец идентификаторов ( CP
), сначала отредактируйте, как идентификаторы выглядят, чтобы соответствовать другому файлу, а затем выполните поиск, есть ли совпадения «CP` между файлами.
Я редактирую CP
первый с помощью:
fullGWAS <- fread('file.csv',sep=",")
colnames(fullGWAS)[1] <- "CP"
fullGWAS2<-gsub("_.*","",fullGWAS$CP)
fullGWAS2 <-data.frame(fullGWAS2)
colnames(fullGWAS2)[1] <- "CP"
fullGWAS3 <- select(fullGWAS, c(2:15))
gwasdf <- cbind(fullGWAS2, fullGWAS3)
В качестве примера gwasdf
выглядит:
> head(gwasdf)
CP chr bpos a1 a2 freq BETAsbp Psbp BETAdbp Pdbp BETApp Ppp minP
1 1:2556125 1 2556125 t c 0.3255 -0.0262 0.41300 -0.0113 0.5388 -0.0157 0.4690 0.41300
2 1:2556548 1 2556548 t c 0.3261 -0.0274 0.39270 -0.0121 0.5096 -0.0160 0.4615 0.39270
3 1:2556709 1 2556709 a g 0.3257 -0.0263 0.41210 -0.0116 0.5266 -0.0155 0.4749 0.41210
4 12:11366987 12 11366987 t c 0.9443 0.0355 0.61460 0.0019 0.9631 0.0185 0.7007 0.61460
5 17:21949792 17 21949792 a c 0.4570 -0.0384 0.20690 -0.0043 0.8065 -0.0212 0.3050 0.20690
6 17:21955349 17 21955349 t g 0.5253 0.0505 0.09562 0.0103 0.5574 0.0248 0.2303 0.09562
minTRAIT BETAmean
1 SBP -0.01875
2 SBP -0.01975
3 SBP -0.01895
4 SBP 0.01870
5 SBP -0.02135
6 SBP 0.03040
Я вижу CP
, что это здесь, но когда я пытаюсь проверить это, я получаю:
exists("gwasdf$CP")
[1] FALSE
class(gwasdf)
[1] "data.frame"
nrow(gwasdf)
[1] 7083535
Почему это false и как я могу сделать так, чтобы это было правдой?
Я пытаюсь в конечном итоге проверить, присутствуют ли идентификаторы CP в другом файле с последующим кодом, используя:
CPmatches <- df2[CP %in% gwasdf$CP] #df2 is another file I just read in
mismatchextract <- subset(gwasdf, !(CP %in% df2$CP))
Для получения дополнительной информации я использую RStudio с:
> sessionInfo()
R version 4.0.2 (2020-06-22)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)
Matrix products: default
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] matrixStats_0.57.0 sqldf_0.4-11 RSQLite_2.2.1 gsubfn_0.7
[5] proto_1.0.0 data.table_1.13.2 forcats_0.5.0 stringr_1.4.0
[9] dplyr_1.0.2 purrr_0.3.4 readr_1.4.0 tidyr_1.1.2
[13] tibble_3.0.4 ggplot2_3.3.2 tidyverse_1.3.0
loaded via a namespace (and not attached):
[1] tidyselect_1.1.0 haven_2.3.1 tcltk_4.0.2 colorspace_1.4-1 vctrs_0.3.4
[6] generics_0.1.0 chron_2.3-56 blob_1.2.1 rlang_0.4.8 pillar_1.4.7
[11] glue_1.4.1 withr_2.3.0 DBI_1.1.0 bit64_4.0.5 dbplyr_2.0.0
[16] modelr_0.1.8 readxl_1.3.1 lifecycle_0.2.0 munsell_0.5.0 gtable_0.3.0
[21] cellranger_1.1.0 rvest_0.3.6 memoise_1.1.0 fansi_0.4.1 broom_0.7.2
[26] Rcpp_1.0.5 scales_1.1.1 backports_1.1.10 jsonlite_1.7.1 fs_1.5.0
[31] bit_4.0.4 hms_0.5.3 digest_0.6.27 stringi_1.5.3 grid_4.0.2
[36] cli_2.2.0 tools_4.0.2 magrittr_2.0.1 crayon_1.3.4 pkgconfig_2.0.3
[41] ellipsis_0.3.1 xml2_1.3.2 reprex_0.3.0 lubridate_1.7.9 assertthat_0.2.1
[46] httr_1.4.2 rstudioapi_0.13 R6_2.5.0 compiler_4.0.2
Комментарии:
1. Я бы использовал
"CP" %in% names(gwasdf)
. Вы также могли бы использоватьis.null(gwasdf$CP)
(!
предположительно, с a).2.
df2[CP %in% gwasdf$CP]
должно статьdf2[df2$CP %in% gwasdf$CP, ]
Ответ №1:
Что-то вроде этого с использованием dplyr
%in%
оператора and? Предполагая, что есть два отдельных набора данных и цель подмножества, основанная на том, принадлежит ли элемент в одном наборе данных отдельному набору данных.
qwasdf_1 <- data.frame(
CP1 = c("1:2556125", "1:2556548", "99:12345678")
)
qwasdf_2 <- data.frame(
CP2 = c("1:2556125", "1:2556548", "1:2556709")
)
library(dplyr)
qwasdf_1 %>%
filter(CP1 %in% qwasdf_2$CP2)
#> CP1
#> 1 1:2556125
#> 2 1:2556548
Создано 2020-11-23 пакетом reprex (версия 0.3.0)
Комментарии:
1. Спасибо вам за это, если у меня есть 7083535 строк, могу ли я вставить его в
c()
или получить его в том формате, как у вас в первой строке каким-то образом?2. Я обновил свое решение, предполагая, что существует 2 отдельных набора данных. В вашем вопросе есть раздел, который наводит меня на мысль, что они есть.
3. Спасибо, да, это 2 отдельных набора данных. Извините, я новичок в r, что вы делаете
"99:12345678"
, чтобы захватить все возможные значения диапазона, и именно поэтому мне не нужно было бы вводить значения 7083535 вc()
одно за другим?4. без
dplyr
u можно было бы просто использоватьqwasdf_1[qwasdf_1$CP1 %in% qwasdf_2$CP2]
, также в качестве примечания при использовании filter u можно было бы удалить имя data.frame, т.е.filter(CP1 %in% qwasdf_2$CP2)
5. @DN1
"99:125363"
— это просто строка, однако99:125363
вектор, содержащий все значения от 99 до 125363