【问题标题】:Create long character strings in name levels在名称级别创建长字符串
【发布时间】:2017-02-01 10:53:11
【问题描述】:

我想按规则对关卡名称进行修改,但我遇到以下问题:

我的数据;最初 df 变量是类矩阵,我改变了它

df <- data.frame(x = c("P27C", "P31B", "P12E", "P3E", "P7A", "P7D", "P2A", "P7D",
"P34", "P10C"),
             y = rnorm(10), stringsAsFactors = F)

s<-c("P27CvsP31B","P27CvsP3C","P27CvsP3E","P27CvsP6B","P27CvsP7A","P27CvsP7C",   
"P27DvsP27E","P27DvsP2B","P27DvsP31A","P27DvsP31B","P27DvsP3D","P27DvsP7D",
"P27EvsP2A","P27EvsP2B","P27EvsP2E","P27EvsP2F","P27EvsP2G","P27EvsP34", 
"P7AvsP7H","P7BvsP7D","P7CvsP7G","P7DvsP7E","P7DvsP7F","P7DvsP7G","P7DvsP7H") 

df

df$z <- lapply(df$x, grep, s, value = T)

# gives you the matches but empty slots for a missing value like "P12E"

df

for (r in 1:nrow(df)) {
    if (length(df$z[[r]]) == 0) {
        df$z[[r]] <- df$x[[r]]
        }
    else {
        df$z[[r]] <- df$z[[r]]
    }
}

# restores the original name of unmatched values

df$z 

#Rename but in list format!!!

我想要的输出是:

     x           y                                                                 z
1  P27C  2.22354499 "P27CvsP31B, P27CvsP3C, P27CvsP3E, P27CvsP6B, P27CvsP7A, P27CvsP7C"
2  P31B  0.89197064                                            "P27CvsP31B, P27DvsP31B"
3  P12E -0.02313754                                                              "P12E"
4   P3E  0.69916446                                                         "P27CvsP3E"
5   P7A -0.44895512                                               "P27CvsP7A, P7AvsP7H"
6   P7D  1.77619979       "P27DvsP7D, P7BvsP7D, P7DvsP7E, P7DvsP7F, P7DvsP7G, P7DvsP7H"
7   P2A -0.18261732                                                         "P27EvsP2A"
8   P7D  0.12025524       "P27DvsP7D, P7BvsP7D, P7DvsP7E, P7DvsP7F, P7DvsP7G, P7DvsP7H"
9   P34 -0.13434265                                                         "P27EvsP34"
10 P10C  0.19971201                                                              "P10C" 

谢谢

【问题讨论】:

    标签: r dataframe rename


    【解决方案1】:

    嵌套的sapply 看起来有点难看。它遍历dfx 列,并将所有条目与您的向量s 匹配,创建匹配结果的列表。第二个sapply 循环遍历该列表并粘贴所有条目。如果不匹配,则返回一个空单元格,我们通过在其位置替换 df$x 条目来处理该单元格。

    df$z <- sapply(sapply(df$x, function(i) s[grepl(i, s)]), paste, collapse = ',')
    df$z[df$z == ''] <- df$x[df$z == '']
    df
    
    #      x           y                                                            z
    #1  P27C -0.95290496 P27CvsP31B,P27CvsP3C,P27CvsP3E,P27CvsP6B,P27CvsP7A,P27CvsP7C
    #2  P31B  1.62237939                                        P27CvsP31B,P27DvsP31B
    #3  P12E  2.60014202                                                         P12E
    #4   P3E  0.13964851                                                    P27CvsP3E
    #5   P7A -1.35071967                                           P27CvsP7A,P7AvsP7H
    #6   P7D  0.79893102       P27DvsP7D,P7BvsP7D,P7DvsP7E,P7DvsP7F,P7DvsP7G,P7DvsP7H
    #7   P2A -1.55499584                                                    P27EvsP2A
    #8   P7D  0.46372006       P27DvsP7D,P7BvsP7D,P7DvsP7E,P7DvsP7F,P7DvsP7G,P7DvsP7H
    #9   P34  0.05242956                                                    P27EvsP34
    #10 P10C -0.20203180                                                         P10C
    

    编辑

    根据@akrun 的建议,data.table 的选项是,

    library(data.table)
    setDT(df)[, z := unlist(lapply(x, function(y) toString(grep(y, s, value = TRUE))))][z=="", z := x][]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 2012-11-16
      • 2016-07-25
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多