R中的字符串的tidyr fill()是否等效?

时间:2018-10-11 19:11:18

标签: r string tidyverse

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

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(),但显然不适用于字符串。字符串是否等效?如果没有的话,有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

(我假设这是从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))

答案 1 :(得分:0)

如果我不得不对您的数据结构有所怀疑,我可能会遇到这样的事情:

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经过优化可处理大量记录,并且是备受尊重的,广泛使用的稳定器包。

答案 2 :(得分:0)

似乎fill()设计为隔离使用。在mutate()语句中使用fill()时,会出现此错误(无论数据类型如何),但仅将其用作管道结构的组件时,此错误会起作用。可能是问题所在吗?

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

people %>%
    fill(group)

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

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