我有一个大型数据集,在一列中有许多重复值,但其余列都缺少我要填写的值。
id <- rep(1:3, 3:1)
name <- c("sam", "sam", "", "mike", "", "tom")
df<- data.frame(id, name)
id name
1 sam
1 sam
1
2 mike
2
3 tom
由于原始数据的性质,id和name字段都是因子(~2000个唯一ID值,acros 45000行)。 我想根据
填写缺失的值我已尝试过unique()
和duplicated()
,但在更换时遇到了困难。
如果愿意,我想使用基础包。
谢谢!
答案 0 :(得分:2)
您可以尝试“动物园”套餐中的na.locf
:
library(zoo)
df$name[df$name == ""] <- NA
na.locf(df)
# id name
# 1 1 sam
# 2 1 sam
# 3 1 sam
# 4 2 mike
# 5 2 mike
# 6 3 tom
坚持基础R,您也可以尝试aggregate
和merge
:
merge(df, aggregate(as.character(name) ~ id, df, function(x) unique(x[x != ""])))
# id name as.character(name)
# 1 1 sam sam
# 2 1 sam sam
# 3 1 sam
# 4 2 mike mike
# 5 2 mike
# 6 3 tom tom
下一步是删除原始的“名称”列,并重命名新创建的列。
答案 1 :(得分:2)
根据Ananda Mahto的建议使用na.locf
是一个很好的解决方案。如果你想留在基地R,你可以这样做:
> udf<-unique(df)
> udf<-udf[udf$name != "",]
> df$name<-udf$name[match(df$id,udf$id)]
> df
id name
1 1 sam
2 1 sam
3 1 sam
4 2 mike
5 2 mike
6 3 tom
在编辑时:如果您有大量数据,match
将会效率低下。在这种情况下,如果您可以保证id
中的df
列已排序,那么findInterval
是更好的选择:
df$name<-udf$name[findInterval(df$id,udf$id)]
事实上,即使id
未排序,我建议先对其进行排序,然后再使用findInterval
。
答案 2 :(得分:0)
您可以尝试使用ave功能
df$name = ave(df$name, df$id,FUN = function(x) unique(x[x!=""]))