Ruby 突出显示从一个df到另一个df的字符串

Ruby 突出显示从一个df到另一个df的字符串,ruby,string,Ruby,String,我有一个txt文件,如下所示。例如,它有6行。每个原始数据都有一个或多个字符串。例如,第一行只有一个字符串,而第二行有两个字符串(它们用逗号分隔)。我还列出了行数,以明确示例 1 P41182 2 P41152,Q9UQL6 3 P41172 4 Q92793,Q09472,Q9Y6Q9 5 Q15021,TQ9472 6 Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3 我有另一个文本,如下所示。同样的结构。例如,第一行只有一个字符串,而第二行有两个字符串 1 P411

我有一个txt文件,如下所示。例如,它有6行。每个原始数据都有一个或多个字符串。例如,第一行只有一个字符串,而第二行有两个字符串(它们用逗号分隔)。我还列出了行数,以明确示例

1 P41182
2 P41152,Q9UQL6
3 P41172
4 Q92793,Q09472,Q9Y6Q9
5 Q15021,TQ9472 
6 Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
我有另一个文本,如下所示。同样的结构。例如,第一行只有一个字符串,而第二行有两个字符串

1 P41182
2 P41152,Q9UYIU
3 P41172
4 Q9IO93,Q9Y6IT
5 P30561
6 Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
7 HT8971
8 HLI872
我想知道第二个数据中与第一个数据相似的一些字符串的索引。以下是一些角色:

如果第一个txt文件中只有一个字符串与第二个txt文件匹配,我不想知道索引。如果第一个txt文件中有多个字符串,并且其中一个或一些字符串与第二个txt文件相似,那么我想知道它们的索引,例如,输出应该如下所示
df3

第二个数据的第一个字符串类似于只有1个成员的第一个数据字符串(每个元素中的字符串用逗号分隔),因此我将其保持原样,不需要索引

第二个txt文件中的第二个字符串类似于第一个txt文件中该行的第二行和第一个字符串,因此它得到2_1

第二个txt文件中的第六个字符串类似于第一个txt文件的第五行和第一个字符串,也类似于第一个txt文件的第六行和第一个字符串,因此它得到5_1和6_1


等等

我假设数据可以用字符串数组表示

arr1 = ["P41182", "P41152,Q9UQL6", "P41172", "Q92793,Q09472,Q9Y6Q9",
        "Q15021,TQ9472", "Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3"]
arr2 = ["P41182", "P41152,Q9UYIU", "P41172", "Q9IO93,Q9Y6IT", "P30561",
        "Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3", "HT8971", "HLI872"] 

h = arr1.each.with_index(1).with_object({}) do |(s1,i),h|
  next unless s1.include?(',')
  s1.split(',').each.with_index(1) { |s2,j| (h[s2] ||= '') << "_#{i}_#{j}" }
end
  #=> {"P41152"=>"_2_1", "Q9UQL6"=>"_2_2", "Q92793"=>"_4_1", "Q09472"=>"_4_2",
  #    "Q9Y6Q9"=>"_4_3", "Q15021"=>"_5_1_6_1", "TQ9472"=>"_5_2", "Q9BPX3"=>"_6_2",
  #    "Q15003"=>"_6_3", "O95347"=>"_6_4", "Q9NTJ3"=>"_6_5"} 

arr2.map {|s1| s1.split(',').map { |s2| h.key?(s2) ? "%s%s" % [s2, h[s2]] : s2 }.join(',')}
  #=> ["P41182", "P41152_2_1,Q9UYIU", "P41172", "Q9IO93,Q9Y6IT", "P30561",
  #    "Q15021_5_1_6_1,Q9BPX3_6_2,Q15003_6_3,O95347_6_4,Q9NTJ3_6_5", "HT8971", "HLI872"]
arr1=[“P41182”、“P41152、Q9UQL6”、“P41172”、“Q92793、Q09472、Q9Y6Q9”,
“Q15021,TQ9472”,“Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3”]
arr2=[“P41182”、“P41152、Q9UYIU”、“P41172”、“Q9IO93、Q9Y6IT”、“P30561”,
“Q15021、Q9BPX3、Q15003、O95347、Q9NTJ3”、“HT8971”、“HLI872”]
h=arr1.each.with_索引(1)。with_对象({})do|(s1,i),h|
下一步,除非s1.包括?(',')
s1.分割(',')。每个。带|索引(1){| s2,j |(h[s2]| |=''){“P41152”=>“|2|1”,“Q9UQL6”=>“| 2|2”,“Q92793”=>“| 4|1”,“Q09472”=>“|4|2”,
#“Q9Y6Q9”=>“\u4\u3”、“Q15021”=>“\u5\u1\u6\u1”、“TQ9472”=>“\u5\u2”、“Q9BPX3”=>“\u6\u2”,
#“Q15003”=>“\u6\u3”、“O95347”=>“\u6\u4”、“Q9NTJ3”=>“\u6\u5”}
arr2.map{s1 | s1.split(',').map{s2 | h.key?(s2)?“%s%s”%[s2,h[s2]]:s2}.join(',')}
#=>[“P41182”、“P41152_2_1、Q9uyu”、“P41172”、“Q9IO93、Q9Y6IT”、“P30561”,
#“Q15021_5_1_6_1,Q9BPX3_6_2,Q15003_6_3,O95347_6_4,Q9NTJ3_6_5”,“HT8971”,“HLI872”]

我想以下ruby代码应该可以工作: 确保df1.txt和df2.txt以逗号分隔。输出为df3.txt。请参阅下面的示例txt文件

df1_hash = {}
df1_term_positions_hash = Hash.new([])
File.readlines("df1.txt").each_with_index do |line, i|
    df1_hash[i+1] = line.strip.split(",")
    for x in line.strip.split(",")
        df1_term_positions_hash[x] += [i+1]
    end
end

df2_hash = {}
File.readlines("df2.txt").each_with_index do |line, i|
    df2_hash[i+1] = line.strip.split(",")
end

df2_size = df2_hash.size
df3_hash = {}
for i in (1..df2_size)
    df3_hash[i] = df2_hash[i].each_with_index.map do |term, intermediate_index|
        number_of_repetitions = df1_term_positions_hash[term].size      
        updated_term = term.dup
        df1_term_positions_hash[term].each_with_index do |repetition_position, index|
            if (df1_hash[repetition_position].size <= 1 rescue true )
                updated_term = term


            else
                additional_tail = "#{repetition_position}_#{df1_hash[repetition_position].index(term)+1}"               
                updated_term = updated_term + "_" + additional_tail
            end
        end
        updated_term
    end

end

File.open("df3.txt", "w") do |file|
    for i in (1..df2_size)
        file.puts df3_hash[i].join(",")
    end
end
df2.txt 以df3.txt格式输出 很抱歉代码有点乱,但它可以工作。
希望有帮助:)

我认为最后一个结果不好,因为长度出现了问题。是的,我会运行它。请给我一些时间。我发现在一个案例中,有不止一个匹配。我们应该为这些案例做些什么?我完全被这个问题迷惑了。我是唯一一个不知道什么是“df”的读者吗是吗?这是一个Rails问题吗?如果是,你需要一个Rails标签。@Cary Swoveland你是对的,这通常是一个R问题,但因为它是一个文本挖掘,所以我尝试用ruby解决它。我修改了这个问题以使其可以理解,现在可以了吗?我现在说得很清楚!!!我希望现在你能理解我的问题,如果我的答案是正确的,没有任何问题g来解释。如果不是,为什么像你的问题中给出的那样,
P41152
应该是
P41152_2_1
?我做了编辑,但仍然不确定我是否完全理解了这个问题。假设
arr1=[“abc”,“def,abc”,“ghi”]
arr2=[“abc”,“ghi”
。答案应该是
[“abc”,“ghi”
(我目前的答案)或
[“abc_1_1_2_2”,“ghi”]
?让我解释一下。在你的例子中,有abc,def,abc,ghi。它们都在一行中。第二个数组是abc,ghi,又在一行中。所以首先我们检查abc,我们看到数组1中有4个元素,我们有两个abc,一个是第一个元素,一个是第三个元素,所以它的答案是我们将是abc_1_1_1_3,第二个是ghi,我们在数组1中有一个类似的元素,该数组有4个元素,因此角色是确定的,它也将获得索引ghi_1_4。现在清楚了吗?我不知道你所说的“…你有
abc
def
abc,ghi
。所有这些都在一行中”.数组没有行的概念。如果我将您的第一个文件读入一个数组,该数组将是
arr1#=>[“P41182”、“P41152、Q9UQL6”、“P41172”、“Q92793、Q09472、Q9Y6Q9”、“Q15021、TQ9472”、“Q15021、Q9BPX3、Q15003、O95347、Q9NTJ3”
。同样,在我的示例中,
arr1
的(三个)元素对应于(三个)因此,文件的第一行是
“abc”
,第二行是
“def,abc”
,第三行是
“ghi”
@nik。你能检查一下,让我知道它是否行吗?你能……只要你认为答案合适并且有效:)@nik更新了代码。你能从这个答案中删除额外的(对话)注释吗?感觉多余。我们不要用它加载。在ruby中绘图是绝对可能的,而且有很多库(gems)对于它。我个人使用。但是,我想它不会像在R中那样漂亮。我建议您使用python或R进行绘图。我知道。但是我使用ruby和python比使用Java要多。我个人不太喜欢它,因为它太冗长了,我无法处理它!
df1_hash = {}
df1_term_positions_hash = Hash.new([])
File.readlines("df1.txt").each_with_index do |line, i|
    df1_hash[i+1] = line.strip.split(",")
    for x in line.strip.split(",")
        df1_term_positions_hash[x] += [i+1]
    end
end

df2_hash = {}
File.readlines("df2.txt").each_with_index do |line, i|
    df2_hash[i+1] = line.strip.split(",")
end

df2_size = df2_hash.size
df3_hash = {}
for i in (1..df2_size)
    df3_hash[i] = df2_hash[i].each_with_index.map do |term, intermediate_index|
        number_of_repetitions = df1_term_positions_hash[term].size      
        updated_term = term.dup
        df1_term_positions_hash[term].each_with_index do |repetition_position, index|
            if (df1_hash[repetition_position].size <= 1 rescue true )
                updated_term = term


            else
                additional_tail = "#{repetition_position}_#{df1_hash[repetition_position].index(term)+1}"               
                updated_term = updated_term + "_" + additional_tail
            end
        end
        updated_term
    end

end

File.open("df3.txt", "w") do |file|
    for i in (1..df2_size)
        file.puts df3_hash[i].join(",")
    end
end
P41182
P41152,Q9UQL6
P41172
Q92793,Q09472,Q9Y6Q9
Q15021,TQ9472 
Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
P41182
P41152,Q9UYIU
P41172
Q9IO93,Q9Y6IT
P30561
Q15021,Q9BPX3,Q15003,O95347,Q9NTJ3
HT8971
HLI872
P41182
P41152_2_1,Q9UYIU
P41172
Q9IO93,Q9Y6IT
P30561
Q15021_5_1_6_1,Q9BPX3_6_2,Q15003_6_3,O95347_6_4,Q9NTJ3_6_5
HT8971
HLI872