繁体   English   中英

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

[英]Is there a equivalent for the tidyr fill() for strings in R?

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

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() 但它显然不适用于字符串。 字符串有等价物吗? 如果没有,有没有办法做到这一点?

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

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

people %>%
    fill(group)

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

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

(我假设这是来自 R 控制台 session 的read.fwf 。如果它是原始文本文件,则可能需要使用 f 读取数据输入。)

显示表明这些是“空格”>中的空字符值

首先将它们设置为 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))

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

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经过优化以处理大量记录,并且是一个非常受人尊敬、广泛使用的稳定 package。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM