R 如何在数据框中搜索多个字符串,并根据字符串列和行提取不同的列内容

R 如何在数据框中搜索多个字符串,并根据字符串列和行提取不同的列内容,r,R,我有一个大数据集(约500000 x 5000),需要执行以下操作: 在整个数据集中搜索多个不同的字符串(一次最多30个) 根据字符串所在的列,从同一行中的另一列检索信息。这些列是链接的,因此列V1链接到D1,而V2链接到D2。因此,如果在第3行中标识了一个字符串,例如,V2我想提取第3行中的值 还应该从同一行的固定列(在我的例子中是ID)中提取值 我已经能够使用来识别每个字符串的行号和列号,但无法根据搜索结果确定提取额外列值的下一步 示例data.frame: df <- data.fr

我有一个大数据集(约500000 x 5000),需要执行以下操作:

  • 在整个数据集中搜索多个不同的字符串(一次最多30个)

  • 根据字符串所在的列,从同一行中的另一列检索信息。这些列是链接的,因此列
    V1
    链接到
    D1
    ,而
    V2
    链接到
    D2
    。因此,如果在第3行中标识了一个字符串,例如,
    V2
    我想提取第3行中的值

  • 还应该从同一行的固定列(在我的例子中是
    ID
    )中提取值

  • 我已经能够使用
    来识别每个字符串的行号和列号,但无法根据搜索结果确定提取额外列值的下一步

    示例
    data.frame

    df <- data.frame("ID" = 1:5,
                     "V1" = c("A1", "A2", "A1", "A3", "A4"),
                     "V2" = c("A6", "NA", "A3", "A2", "A1"),
                     "D1" = c("B3", "B3", "B2", "B1", "B5"),
                     "D2" = c("B8", "NA", "B2", "B6", "B2"), 
                     stringsAsFactors=FALSE)
    
    ID V1 V2 D1 D2
    1  A1 A6 B3 B8   
    2  A2 NA B3 NA   
    3  A1 A3 B2 B2 
    4  A3 A2 B1 B6 
    5  A4 A1 B5 B2
    

    下面是一个使用
    数据的选项。表

    library(data.table)
    setDT(df)
    df_melted <- melt(df, id.vars = "ID",  measure.vars = patterns(V = '^V', D = '^D'))
    df_melted 
    #     ID variable  V  D
    #  1:  1        1 A1 B3
    #  2:  2        1 A2 B3
    #  3:  3        1 A1 B2
    #  4:  4        1 A3 B1
    #  5:  5        1 A4 B5
    #  6:  1        2 A6 B8
    #  7:  2        2 NA NA
    #  8:  3        2 A3 B2
    #  9:  4        2 A2 B6
    # 10:  5        2 A1 B2
    
    strings <- c("A1")
    df_melted[V %chin% strings, paste0('ID: ', ID, ', D', variable, ": ", D)]
    # "ID: 1, D1: B3" "ID: 3, D1: B2" "ID: 5, D2: B2"
    
    库(data.table)
    setDT(df)
    
    在R基中,我们可以分离
    “V”和
    “D”列,找到
    “A1”的出现
    V_cols
    获取相应的
    ID
    ,由于
    V_cols
    D_cols
    是链接的,我们可以使用
    D_cols
    获取相应的值,该
    具有行和列索引

    V_cols <- grep("^V", names(df), value = TRUE)
    D_cols <- grep("^D", names(df), value = TRUE)
    
    mat <- which(df[V_cols] == "A1", arr.ind = TRUE)
    data.frame(ID = df$ID[mat[, 1]], D_var = df[D_cols][mat], D_col = D_cols[mat[, 2]])
    
    #  ID D_var D_col
    #1  1    B3    D1
    #2  3    B2    D1
    #3  5    B2    D2
    
    V_cols
    
    V_cols <- grep("^V", names(df), value = TRUE)
    D_cols <- grep("^D", names(df), value = TRUE)
    
    mat <- which(df[V_cols] == "A1", arr.ind = TRUE)
    data.frame(ID = df$ID[mat[, 1]], D_var = df[D_cols][mat], D_col = D_cols[mat[, 2]])
    
    #  ID D_var D_col
    #1  1    B3    D1
    #2  3    B2    D1
    #3  5    B2    D2