Как сделать так, чтобы столбец существовал в r?

#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