【问题标题】:Replace empty cells in R with consecutive values (R, loops)用连续值替换 R 中的空单元格(R,循环)
【发布时间】:2020-05-16 16:35:10
【问题描述】:

我有一个数据集 df,其中一列包含空白值,我需要填充这些值。如何用连续值填充空白“”字段? (我有一个包含超过 10,000 行的数据集)

                   Subject Folder

                   hi      outlookdata
                   hi      outlookdata
                   hi      outlookdata
                           outlookdata
                           outlookdata
                   hello   outlookdata
                   hello   outlookdata
                           outlookdata
                           outlookdata 
                           outlookdata
                           outlookdata
                   hi      outlookdata

这是我想要的输出:

                   Subject Folder

                   hi      outlookdata
                   hi      outlookdata
                   hi      outlookdata
                   a       outlookdata
                   a       outlookdata
                   hello   outlookdata
                   hello   outlookdata
                   b       outlookdata
                   b       outlookdata 
                   b       outlookdata
                   b       outlookdata
                   goodbye outlookdata 

这是我的数据的输入:

 structure(list(Subject = structure(c(4L, 4L, 4L, 1L, 1L, 3L, 
 3L, 1L, 1L, 1L, 1L, 2L), .Label = c("", "goodbye", "hello", "hi"
 ), class = "factor"), Folder = structure(c(1L, 1L, 1L, 1L, 1L, 
 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "outlookdata", class = "factor")), class = "data.frame",     row.names = c(NA, 
-12L))

我不确定是否应该使用循环?

   for (i in 1:nrow(df)){
          if(df$Subject[i]=="")({ 
          df$Subject[i]=df$Subject[i-1] 
        }
     }

我希望替换“”的值是连续的。 任何建议都有帮助。

【问题讨论】:

    标签: r string loops dplyr


    【解决方案1】:

    我们可以为此使用rleid。 “主题”列是factor,因此它被转换为character,否则分配新值需要通过添加或再次调用factor 来更改levels。转换为data.table (setDT),创建替换值向量('nm1'),在dataest中,在'Subject'上通过rleid创建新列'grp',然后按'grp'分组',如果'Subject'为空(在i上指定),则将'Subject'分配(j)作为'nm1'中与.GRP提供的数字索引相对应的值,然后通过分配给NULL删除'grp'

    library(data.table)
    df1$Subject <- as.character(df1$Subject)
    nm1 <- c(letters, do.call(paste0, expand.grid(letters, 1:1000)))
    setDT(df1)[, grp := rleid(Subject)][Subject == "", 
          Subject := nm1[.GRP], grp][, grp := NULL][]
    #    Subject      Folder
    # 1:      hi outlookdata
    # 2:      hi outlookdata
    # 3:      hi outlookdata
    # 4:       a outlookdata
    # 5:       a outlookdata
    # 6:   hello outlookdata
    # 7:   hello outlookdata
    # 8:       b outlookdata
    # 9:       b outlookdata
    #10:       b outlookdata
    #11:       b outlookdata
    #12: goodbye outlookdata
    

    【讨论】:

    • 10000 行 letters 可能还不够,还是我遗漏了什么?
    • @TanishaHudson。我做了更正。现在,长度为 26026 的“nm1”将覆盖它
    • 现在让我试试这个。谢谢你。 @Akrun 这些值是否有可能是字母数字?
    • @TanishaHudson 您可以使用paste 创建任何类型的值,即nm1 &lt;- c(letters, do.call(paste0, expand.grid(letters, letters, 1:100)))
    • 谢谢@Akrun!你们太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2020-04-23
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多