R 要替换的项目数不是数据帧替换长度的倍数

R 要替换的项目数不是数据帧替换长度的倍数,r,dataframe,R,Dataframe,我知道很多关于这个话题的帖子已经存在了,但是我仍然很难理解这个错误。我收到的错误是要替换的项目数不是替换长度的倍数 当我在一个较小的练习数据框上运行代码时,它运行得非常完美,没有任何错误。一旦我试图在实际的大数据帧上运行代码,就会出现错误。这是因为我的数据帧的大小,还是我完全没有抓住要点 我见过其他人在运行for循环之前创建了一个临时矩阵或向量,我做了一次,但是我需要做两次吗,因为我使用了两个for循环?我不明白为什么会出现这种情况,尤其是在较小的数据帧上 df 我编写的代码将Des.genes

我知道很多关于这个话题的帖子已经存在了,但是我仍然很难理解这个错误。我收到的错误是要替换的项目数不是替换长度的倍数

当我在一个较小的练习数据框上运行代码时,它运行得非常完美,没有任何错误。一旦我试图在实际的大数据帧上运行代码,就会出现错误。这是因为我的数据帧的大小,还是我完全没有抓住要点

我见过其他人在运行for循环之前创建了一个临时矩阵或向量,我做了一次,但是我需要做两次吗,因为我使用了两个for循环?我不明白为什么会出现这种情况,尤其是在较小的数据帧上

df

我编写的代码将Des.genesymber中的值替换为“-”

当我在实际的数据帧上运行这个时,计数会增加到大约120000。在这个小数据帧上不会给出错误,只在我的大数据帧上给出

有人能解释一下为什么会发生这种情况吗


编辑:将数据框与我提供的数据匹配。我还混合了Des.Description中的值,以更准确地显示所需内容。

编辑:OP已澄清其生产数据比其初始简化样本数据集更复杂。他相应地更新了问题和样本数据集。简化数据集的解决方案保留在下面作为参考,但输出被删除,因为它不再匹配更新的、更真实的样本数据集

简化情形的解法 很难理解双for循环是如何工作的。因此,我建议使用基本R中的
ifelse()

df$Des.GeneSymbol <- ifelse(df$Des.GeneSymbol == df$Des.Description, "-", Des.GeneSymbol)
df
这里有两个优点:

  • ifelse()
    返回完整向量时,仅替换满足条件的行中的值
  • data.table
    就地更新,即不复制整个可能较大的对象
  • 然而,这仍然是一个逐行比较,不能反映OP的生产数据

    更新的解决方案 OP已澄清匹配项可能不在同一行中。这就是OP在其代码中使用双
    for
    循环的原因

    有了澄清和更新的数据集,我们需要一种完全不同的方法来查找data.frame中其他地方的匹配项。下面的代码使用自连接查找其他行中的匹配项,并使用连接更新替换匹配项

    library(data.table)
    
    setDT(df)[df, on = c("Des.GeneSymbol==Des.Description"), Des.GeneSymbol := "-"][]
    

    我为这一差异道歉。我编辑了可视df以适应框架,而没有编辑实际输入。你在下面提供的答案很好地解决了这个问题,所以我不想做任何编辑。我现在正在尝试您的解决方案,但这需要一段时间。这似乎可以很好地工作,但如果行不相等怎么办?如果等效行的位置不同,我使用了双for循环,即genesymble的第10行是admin.project_代码,但相同的值直到Des.Description的第17行才出现。这些选项还能用吗?@josh。请您提供一个更真实的样本数据集,它在不同的行中有匹配项。我需要这个做测试。谢谢。我已经按照你的要求做了更改,并试图使数据更准确地匹配df。谢谢,Josh。我把我的新答案贴在你的最后修正之前。所以我以后也要修改我的答案。我很高兴你注意到性能有所提高。正确使用
    数据。表
    语法是关键。对于学习data.table(包括join…on),我推荐全面的小插曲和常见问题解答,以及Frank优秀的Quick R教程的第3章
    
    remove_description <- df[, "Des.Description"]
    count <- 1
    for (cell in df[, "Des.GeneSymbol"]) {
      for(value in remove_description) {
        if (cell == value) {
          df[, "Des.GeneSymbol"][count] <- "-"
          break;
        }
      }
      count <- count + 1
    }
    
        Des.GeneSymbol       Des.Description
    1       A1BG                CHR19-
    2       A1BG                1
    3       A1BG                1
    4       A1BG                1
    5       A1BG                Missense_Mutation
    6       A1BG-AS1            CHR19+
    7       A1BG-AS1            503538
    8       A1BG-AS1            503538
    9       A1BG-AS1            503538
    10         -                admin.file_uuid
    11         -                admin.month_of_dcc_upload
    12         -                admin.project
    13         -                admin.year_of_dcc_upload
    14         -                admin.patient_withdrawl
    15         -                patient.age_at_initial
    16         -                patient.anatomic_neoplasm
    17         -                admin.batch_number
    18         -                patient.axillary_lymph_node
    
    df$Des.GeneSymbol <- ifelse(df$Des.GeneSymbol == df$Des.Description, "-", Des.GeneSymbol)
    df
    
    library(data.table)
    setDT(df)[Des.GeneSymbol == Des.Description, Des.GeneSymbol := "-"][]
    
    library(data.table)
    
    setDT(df)[df, on = c("Des.GeneSymbol==Des.Description"), Des.GeneSymbol := "-"][]
    
        Des.GeneSymbol             Des.Description
     1:           A1BG                      CHR19-
     2:           A1BG                           1
     3:           A1BG                           1
     4:           A1BG                           1
     5:           A1BG           Missense_Mutation
     6:       A1BG-AS1                      CHR19+
     7:       A1BG-AS1                      503538
     8:       A1BG-AS1                      503538
     9:       A1BG-AS1                      503538
    10:              -             admin.file_uuid
    11:              -   admin.month_of_dcc_upload
    12:              -               admin.project
    13:              -    admin.year_of_dcc_upload
    14:              -    admin.patient_withdrawal
    15:              -      patient.age_at_initial
    16:              -   patient.anatomic_neoplasm
    17:              -          admin.batch_number
    18:              - patient.axillary_lymph_node