通过部分列字符识别R

时间:2018-05-30 19:11:32

标签: r loops subset multiple-columns stringr

我想通过选择具有部分字符识别的列来对我的数据框进行子集化,当我有一个“名称”来识别时,该列可以正常工作。 数据框的位置是:

         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 :(得分:1)

使用您的数据可以执行以下操作:

  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())
    
  5. list2env之后的最终结果是2个data.frames,称为“ABBA”“ACRU”,然后您可以访问它们。如果需要进一步操作,您可以将所有内容留在列表中并在那里进行操作。

答案 1 :(得分:1)

一个选项是使用mapplySIMPLIFY=FALSE来返回每个物种的数据框列表。来自startsWith的{​​{1}}函数将为以specie name开头的子列提供选项。

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

答案 2 :(得分:0)

我认为您应首先选择所有匹配的列,然后再选择data.frame。

import happybase

HOST = 'Hbase server host name here'
TABLE_NAME = 'MyTable'
ROW_PREFIX = 'MyPrefix'
COL_TXT = 'CI:BO'.encode('utf-8') # column family CI, column name BO (Text)
COL_LONG = 'CI:BT'.encode('utf-8') # column family CI, column name C (Long)

conn = happybase.Connection(HOST) # uses default port 9095, but provide second arg if non-default port
myTable = conn.table(TABLE_NAME)

for rowID, row in myTable.scan(row_prefix=ROW_PREFIX.encode('utf-8')): # or leave empty if want full table scan
    colValTxt = row[COL_TXT].decode('utf-8')
    colValLong = int.from_bytes(row[COL_LONG], byteorder='big')
    print('Row ID: {}\tColumn Value: {}'.format(rowID, colValTxt))
print('All Done')

patterns <- c("ABB", "CDC") res <- lapply(patterns, function(x) grep(x, colnames(df), value=TRUE)) df[, unique(unlist(res))] object是每个模式匹配列的列表

下一步是选择唯一的一组列:res和subselect data.frame。

如果您正在编写unique(unlist(res))代码,那么这可能不是最佳答案。