0

1 つの列に多くの値が繰り返される大きなデータ セットがありますが、残りの列には入力したい欠損値があります。

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()と を試しduplicated()ましたが、交換に苦労しています。できればベースパッケージを使いたいです。

ありがとう!

4

3 に答える 3

2

na.locf「zoo」パッケージから試すことができます:

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

次のステップは、元の「名前」列を削除し、新しく作成された列の名前を変更することです。

于 2013-10-14T16:55:51.960 に答える
2

na.locfAnanda Mahto が提案したように使用することは良い解決策です。ベース 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非効率的になります。この場合、iddfがソートされていることを保証できる場合は、次の方法を使用することをお勧めしますfindInterval

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

実際、idがソートされていなくても、最初にソートしてから を使用することをお勧めしfindIntervalます。

于 2013-10-14T17:09:03.997 に答える