在多列中搜索字符串

时间:2018-05-07 09:02:59

标签: r dataframe search

我有一个从.CSV文件中读取的大型数据帧(大约40000 x 500)。数据集包含错误代码组合列表,每个组合专门列出所有唯一代码。我正在搜索包含某段字符串的行,例如"name=",以查看是否知道谁列出了该组合。问题是我不知道这可能出现在哪一列,因为第10列及以后每行不规则,因为每个组合的错误代码数量是不规则的。这意味着在某些点之后行是空的,除了最大的错误代码组合。我只知道如果行包含我正在寻找的字符串,它将在包含任何信息的行的最后6列之一。如果我正在寻找的那条字符串连续找到,我想在另一列中找到答案。

我已经广泛寻找解决方案,但我找不到满足我需求的任何东西。另外,我是R.的新手。

[Fake dataset]

  Year  Problem_ID  Number.of.errors  X      X.1    X.2       X.3       X.4
1 2005  Server      2                 X-4555 X-1222 name=Sara
2 2011  Hardware    3                 X-8922 X-7644 X-6485
3 2015  Software    4                 X-8494 X-4321 X-7452    X-5321   name=John
4 2018  Hardware    2                 X-6901 X-1121  
5 2007  Server      3                 X-7655 X-6555 X-8999    name=Sara

[Desired output]

  Year  Problem_ID  Number.of.errors Name X      X.1    X.2       X.3       X.4
1 2005  Server      2                1    X-4555 X-1222 name=Sara
2 2011  Hardware    3                0     X-8922 X-7644 X-6485
3 2015  Software    4                1     X-8494 X-4321 X-7452    X-5321   name=John
4 2018  Hardware    2                0     X-6901 X-1121  
5 2007  Server      3                1     X-7655 X-6555 X-8999    name=Sara

1 个答案:

答案 0 :(得分:2)

选项#1:

您可以按照@RomanLuštrik的建议使用apply获取name列。必须使用name=any检查该行中的任何列是否与grep匹配的文字。解决方案如下:

df$name <- apply(df, 1, function(x)as.integer(any(grep("name=",x))))

df
#   Year Problem_ID Number.of.errors      X    X.1       X.2       X.3       X.4 name
# 1 2005     Server                2 X-4555 X-1222 name=Sara      <NA>      <NA>    1
# 2 2011   Hardware                3 X-8922 X-7644    X-6485      <NA>      <NA>    0
# 3 2015   Software                4 X-8494 X-4321    X-7452    X-5321 name=John    1
# 4 2018   Hardware                2 X-6901 X-1121      <NA>      <NA>      <NA>    0
# 5 2007     Server                3 X-7655 X-6555    X-8999 name=Sara      <NA>    1

选项#2: 如果OP仅对包含name=文字的行感兴趣,那么它将成为用户csv行,然后过滤掉包含name=的行。

  All_lines <- readLines(file_name)

  desired_lines <- grep("name=", All_lines, value = TRUE)

desired_lines只获得包含name=的行。

数据:

df <- read.table(text = 
"Year  Problem_ID  Number.of.errors  X      X.1    X.2       X.3       X.4
1 2005  Server      2                 X-4555 X-1222 name=Sara NA       NA
2 2011  Hardware    3                 X-8922 X-7644 X-6485    NA       NA
3 2015  Software    4                 X-8494 X-4321 X-7452    X-5321   name=John
4 2018  Hardware    2                 X-6901 X-1121 NA       NA       NA 
5 2007  Server      3                 X-7655 X-6555 X-8999    name=Sara    NA",
header = TRUE, stringsAsFactors = FALSE)