R:根据其他行的唯一值更改行

时间:2013-10-14 16:52:50

标签: r

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

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(),但在更换时遇到了困难。 如果愿意,我想使用基础包。

谢谢!

3 个答案:

答案 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,您也可以尝试aggregatemerge

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)

您可以尝试使用av​​e功能

df$name = ave(df$name, df$id,FUN = function(x) unique(x[x!=""]))