【问题标题】:R: Change rows based on unique values of other rowsR:根据其他行的唯一值更改行
【发布时间】:2013-10-15 02:33:14
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    按照 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 将是低效的。在这种情况下,如果可以保证df 中的id 列是排序好的,那么findInterval 是一个更好的选择:

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

    其实即使id没有排序,我还是建议先排序再使用findInterval

    【讨论】:

      【解决方案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
      

      坚持使用base 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
      

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

      【讨论】:

        【解决方案3】:

        你可以试试用ave函数

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

        【讨论】:

          猜你喜欢
          • 2017-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-02
          • 1970-01-01
          • 1970-01-01
          • 2019-03-30
          • 2021-05-12
          相关资源
          最近更新 更多