R 要替换的项目数不是数据帧替换长度的倍数
我知道很多关于这个话题的帖子已经存在了,但是我仍然很难理解这个错误。我收到的错误是要替换的项目数不是替换长度的倍数 当我在一个较小的练习数据框上运行代码时,它运行得非常完美,没有任何错误。一旦我试图在实际的大数据帧上运行代码,就会出现错误。这是因为我的数据帧的大小,还是我完全没有抓住要点 我见过其他人在运行for循环之前创建了一个临时矩阵或向量,我做了一次,但是我需要做两次吗,因为我使用了两个for循环?我不明白为什么会出现这种情况,尤其是在较小的数据帧上 df 我编写的代码将Des.genesymber中的值替换为“-” 当我在实际的数据帧上运行这个时,计数会增加到大约120000。在这个小数据帧上不会给出错误,只在我的大数据帧上给出 有人能解释一下为什么会发生这种情况吗R 要替换的项目数不是数据帧替换长度的倍数,r,dataframe,R,Dataframe,我知道很多关于这个话题的帖子已经存在了,但是我仍然很难理解这个错误。我收到的错误是要替换的项目数不是替换长度的倍数 当我在一个较小的练习数据框上运行代码时,它运行得非常完美,没有任何错误。一旦我试图在实际的大数据帧上运行代码,就会出现错误。这是因为我的数据帧的大小,还是我完全没有抓住要点 我见过其他人在运行for循环之前创建了一个临时矩阵或向量,我做了一次,但是我需要做两次吗,因为我使用了两个for循环?我不明白为什么会出现这种情况,尤其是在较小的数据帧上 df 我编写的代码将Des.genes
编辑:将数据框与我提供的数据匹配。我还混合了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