[英]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.