基于Number列去除MASTERFILE重复行并保留第3列的代码问题
解决data.frame去重并保留指定列的问题
我来帮你排查代码里的问题,顺便给你几个靠谱的解决方案!
你的代码运行出错的核心原因是长度不匹配:unique(MASTERFILE$Number)会返回去重后的Number值(比如你示例里的c(1,2,3,4,5),长度为5),但MASTERFILE[,3]是原表第三列的所有行(长度为6),R无法把两个长度不同的向量直接组合成合法的data.frame,要么会触发警告并循环短向量填充,要么直接报错。
方法1:Base R原生实现(无需额外包)
我们可以先筛选出Number列不重复的行,再提取需要的列,这样能保证行的对应关系正确:
# 筛选出Number列首次出现的不重复行(保留第一个重复项) non_duplicate_rows <- !duplicated(MASTERFILE$Number) # 提取Number列和原表第三列,组合成新data.frame uniqueIDs <- MASTERFILE[non_duplicate_rows, c("Number", colnames(MASTERFILE)[3])]
如果想要保留每个重复值的最后一次出现,只需要给duplicated()加fromLast=TRUE参数:
non_duplicate_rows <- !duplicated(MASTERFILE$Number, fromLast = TRUE) uniqueIDs <- MASTERFILE[non_duplicate_rows, c("Number", colnames(MASTERFILE)[3])]
方法2:用dplyr包更简洁实现(推荐)
如果你习惯tidyverse风格的代码,dplyr的distinct()函数可以一步搞定,可读性更强:
library(dplyr) # 按Number列去重,同时保留所有其他列,最后筛选出需要的两列 uniqueIDs <- MASTERFILE %>% distinct(Number, .keep_all = TRUE) %>% # 去重并保留所有列 select(Number, 3) # 只保留Number列和第三列
这里的.keep_all = TRUE是关键,它告诉R去重时不要只返回Number列,而是保留该行的所有其他列,之后我们再用select()精准提取需要的列即可。
内容的提问来源于stack exchange,提问作者WoeIs
相关产品推荐
相关产品推荐

