Удаление столбцов в кадре данных путем частичного распознавания символов столбцов R - PullRequest
0 голосов
/ 30 мая 2018

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

         ABBA01A ABBA01B ABBA02A ABBA02B ACRU01A ACRU01B ACRU02A ACRU02B 
    1908      NA      NA      NA      NA      NA      NA      NA      NA           
    1909      NA      NA      NA      NA      NA      NA      NA      NA          
    1910      NA      NA      NA      NA      NA      NA      NA      NA         
    1911      NA      NA      NA      NA      NA      NA      NA      NA      
    1912      NA      NA      NA      NA      NA      NA      NA      NA      
    1913      NA      NA      NA      NA      NA      NA      NA      NA      

    library(stringr)
    df[str_detect(names(df), "ABBA" )]

работает и возвращает:

         ABBA01A ABBA01B ABBA02A ABBA02B 
    1908      NA      NA      NA      NA    

Итак, я хотел бы создать фрейм данных для каждого из моих видов:

    Speciesnames=unique ( substring (names(df),0, 4))
    Speciesnames
     [1] "ABBA" "ACRU" "ARCU" "PIAB" "PIGL" 

Я пытался создать цикл и использовать [i] в ​​качестве названия вида, но функция str_detect его не распознает.и я хотел бы добавить дополнительные вычисления в цикл

    for ( i in seq_along(Speciesnames)){

      df=df[str_detect(names(df), pattern =[i])]

      print(df)
     #my function for the subsetted dataframe
    }

спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Используя ваши данные, вы можете сделать следующее:

  1. создать список для хранения создаваемых data.frames.
  2. отфильтровать data.frames и сохранить в списке
  3. присваивает каждому data.frame имя вида
  4. выводит все data.frames из глобальной среды из списка

    Speciesnames <- unique(substring(names(df),0, 4))
    
    data <- vector("list", length(Speciesnames))
    
    for(i in seq_along(Speciesnames)) {
      data[[i]] <- df %>% select(starts_with(Speciesnames[i]))
    }
    names(data) <- Speciesnames
    
    list2env(data, envir = globalenv())
    

Конечным результатом после list2env является 2 data.frames, называемые «ABBA» и «ACRU», к которым вы затем можете получить доступ.Если необходимы дальнейшие манипуляции, вы можете оставить все в списке и сделать это там.

0 голосов
/ 30 мая 2018

Можно использовать mapply с SIMPLIFY=FALSE для возврата списка фреймов данных для каждого вида.Функция startsWith из base-R предоставит опцию для поднабора столбцов, начинающихся с имени вида.

# First find species but taking unique first 4 characters from column names
species <- unique(gsub("([A-Z]{4}).*", "\\1",names(df)))

# Pass each species 
listOfDFs <- mapply(function(x){
  df[,startsWith(names(df),x)]    # Return only columns starting with species
}, species, SIMPLIFY=FALSE)

listOfDFs
# $ABBA
#      ABBA01A ABBA01B ABBA02A ABBA02B
# 1908      NA      NA      NA      NA
# 1909      NA      NA      NA      NA
# 1910      NA      NA      NA      NA
# 1911      NA      NA      NA      NA
# 1912      NA      NA      NA      NA
# 1913      NA      NA      NA      NA
# 
# $ACRU
#      ACRU01A ACRU01B ACRU02A ACRU02B
# 1908      NA      NA      NA      NA
# 1909      NA      NA      NA      NA
# 1910      NA      NA      NA      NA
# 1911      NA      NA      NA      NA
# 1912      NA      NA      NA      NA
# 1913      NA      NA      NA      NA

Данные:

df <- read.table(text =  
"ABBA01A ABBA01B ABBA02A ABBA02B ACRU01A ACRU01B ACRU02A ACRU02B 
1908      NA      NA      NA      NA      NA      NA      NA      NA           
1909      NA      NA      NA      NA      NA      NA      NA      NA          
1910      NA      NA      NA      NA      NA      NA      NA      NA         
1911      NA      NA      NA      NA      NA      NA      NA      NA      
1912      NA      NA      NA      NA      NA      NA      NA      NA      
1913      NA      NA      NA      NA      NA      NA      NA      NA",
header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 30 мая 2018

Я думаю, что вы должны сначала выбрать все соответствующие столбцы, а затем выбрать свой data.frame.

patterns <- c("ABB", "CDC")
res <- lapply(patterns, function(x) grep(x, colnames(df), value=TRUE))
df[, unique(unlist(res))]

res объект - это список соответствующих столбцов для каждого шаблона

Следующим шагом является выбор уникального набора столбцов: unique(unlist(res)) и выбор элемента data.frame.

Если вы пишете код production, возможно, это не лучший ответ.

...