0

我有一个大型数据集,其中一列中有许多重复值,但其余列缺少我想填写的值。

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 值,超过 45000 行)。我想根据以下内容填写缺失值

我试过unique()and duplicated(),但更换有困难。如果愿意,我想使用基本包。

谢谢!

4

3 回答 3

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

aggregate坚持使用基础 R ,您还可以尝试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

下一步是删除原始的“名称”列并重命名新创建的列。

于 2013-10-14T16:55:51.960 回答
2

按照 Ananda Mahto 的建议使用na.locf是一个很好的解决方案。如果你想继续使用 base 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效率会很低。在这种情况下,如果您可以保证 in 中的iddf已排序,那么findInterval是一个更好的选择:

df$name<-udf$name[findInterval(df$id,udf$id)]

事实上,即使id没有排序,我也建议先排序,然后使用findInterval.

于 2013-10-14T17:09:03.997 回答
0

您可以尝试使用 ave 功能

df$name = ave(df$name, df$id,FUN = function(x) unique(x[x!=""]))
于 2013-10-14T18:33:14.477 回答