【问题标题】:Is there a equivalent for the tidyr fill() for strings in R?R 中字符串的 tidyr fill() 是否有等价物?
【发布时间】:2019-03-16 23:09:15
【问题描述】:

所以我有一个像这样的数据框:

First Group  Bob
             Joe
             John
             Jesse
Second Group Jane
             Mary
             Emily
             Sarah
             Grace

我想用该列中的最后一个字符串填充数据框第一列中的空单元格,即

First Group  Bob
First Group  Joe
First Group  John
First Group  Jesse
Second Group Jane
Second Group Mary
Second Group Emily
Second Group Sarah
Second Group Grace

使用 tidyr,有 fill(),但它显​​然不适用于字符串。字符串有等价物吗?如果没有,有没有办法做到这一点?

【问题讨论】:

  • 您确定它不适用于字符列吗?
  • 测试它给了我Error in UseMethod("fill_") : no applicable method for 'fill_' applied to an object of class "character",尽管?fill 说它需要原子向量。你可以做这样的事情。 stackoverflow.com/questions/23340150/…
  • fill 填充缺失值,即NA。你的“空单元格”是NA,还是""('空白'character);注意c("a", "", "b")c("a", NA, "b") 之间的区别。 fill(data.frame(x = c("a", "", "b")), x); fill(data.frame(x = c("a", NA, "b")), x)
  • 可能与此处相关:检查 read.table 中的 na.strings 参数。
  • 如果您可以包含MWE,这将有助于我们理解您的数据。最简单和推荐的方法是使用dput() 为您的示例数据提供结构。这样一来,那些想要提供帮助的人就可以轻松获得帮助,并且您将大大增加获得更好/更快/更多响应的机会。

标签: r string tidyverse


【解决方案1】:

似乎 fill() 被设计为单独使用。在 mutate() 语句中使用 fill() 时,会出现此错误(无论数据类型如何),但在仅将其用作管道结构的组件时会出现此错误。会不会是这个问题?

为了清楚起见,举一个简单的例子。假设您有一个名为“people”的数据框,其中包含“group”和“name”列,那么正确的结构应该是:

people %>%
    fill(group)

以下将给出您描述的错误(以及使用数字时的类似错误):

people %>%
    mutate(
        group = fill(group)
    )

【讨论】:

    【解决方案2】:

    (我假设这是从 R 控制台会话输出的。如果它是原始文本文件,则可能需要使用 read.fwf 完成数据输入。)

    显示提示那些是“空格”中的空字符值">

    首先将它们设置为 NA,然后使用 zoo 中的 na.locf:

     dat[dat==""] <- NA
     dat[1:2] <- lapply(dat[1:2], zoo::na.locf)
     dat
    #------------
          V1    V2    V3
    1  First Group   Bob
    2  First Group   Joe
    3  First Group  John
    4  First Group Jesse
    5 Second Group  Jane
    6 Second Group  Mary
    7 Second Group Emily
    8 Second Group  Sara
    9 Second Group Grace
    

    从我使用的开始:

    dat <-
    structure(list(V1 = structure(c(2L, 1L, 1L, 1L, 3L, 1L, 1L, 1L, 
    1L), .Label = c("", "First", "Second"), class = "factor"), V2 = structure(c(2L, 
    1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L), .Label = c("", "Group"), class = "factor"), 
        V3 = structure(c(1L, 6L, 7L, 5L, 4L, 8L, 2L, 9L, 3L), .Label = c("Bob", 
        "Emily", "Grace", "Jane", "Jesse", "Joe", "John", "Mary", 
        "Sara"), class = "factor")), class = "data.frame", row.names = c(NA, 
    -9L))
    

    【讨论】:

      【解决方案3】:

      如果我必须试探一下你的数据结构是什么,我可能会有这样的事情:

      df <- data.frame(c1=c("First Group", "", "", "", "Second Group", "", "", "", ""),
                       c2=c("Bob","Joe","Jon","Jesse","Jane","Mary","Emily","Sara","Grace"),
                       stringsAsFactors = FALSE)
      

      然后,一个非常基本的方法是简单地循环:

      for(i in 2:nrow(df)) if(df$c1[i]=="") df$c1[i] <- df$c1[i-1]  
      
      df
      
                  c1    c2
      1  First Group   Bob
      2  First Group   Joe
      3  First Group   Jon
      4  First Group Jesse
      5 Second Group  Jane
      6 Second Group  Mary
      7 Second Group Emily
      8 Second Group  Sara
      9 Second Group Grace
      

      但是,如果您有小数据集以外的任何其他内容,我建议您接受 @42- 的解决方案,因为 zoo::na.locf 已针对大量记录进行了优化,并且是一个非常受人尊敬且广泛使用的稳定包。

      【讨论】:

        猜你喜欢
        • 2017-12-17
        • 1970-01-01
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 2016-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多