[编辑以反映一个更好的例子]
说我有这样的数据框:
df <- data.frame(x = c("A","A","B", "B"), year = c(2001,2004,2002,2005))
> df
x year
1 A 2001
2 A 2004
3 B 2002
4 B 2005
如何在保留year
的同时将x
增加1?我想填写year
,以便顺序如下:
x year
1 A 2001
2 A 2002
3 A 2003
4 A 2004
5 B 2002
6 B 2003
7 B 2004
8 B 2005
有人可以推荐这样做的好方法吗?
@useR推荐这种方法:
> data.frame(year = min(df$year):max(df$year)) %>%
full_join(df) %>%
fill(x)
Joining, by = "year"
year x
1 2001 A
2 2002 B
3 2003 B
4 2004 A
5 2005 B
然而,这与所需的输出不匹配。
答案 0 :(得分:4)
使用基础R(在zoo
的帮助下):
full_df = data.frame(year = min(df$year):max(df$year))
df = merge(df, full_df, all = TRUE)
df = df[order(df$year), ]
df$x = zoo::na.locf(df$x)
df
# year x
# 1 2001 A
# 2 2002 A
# 3 2003 A
# 4 2004 B
# 5 2005 B
# 6 2006 B
# 7 2007 C
使用“tidyverse”
df <- data.frame(x = LETTERS[1:3], year = c(2001,2004,2007))
library(dplyr)
library(tidyr)
df = df %>% mutate(year = factor(year, levels = min(year):max(year))) %>%
complete(year) %>%
fill(x) %>%
mutate(year = as.numeric(as.character(year)))
df
# # A tibble: 7 x 2
# year x
# <dbl> <fctr>
# 1 2001 A
# 2 2002 A
# 3 2003 A
# 4 2004 B
# 5 2005 B
# 6 2006 B
# 7 2007 C
答案 1 :(得分:4)
使用echo $string = hex2bin("FFF7BBFF");
和tidyr::complete
的选项可以是:
dplyr::lead
已编辑:已修改数据的解决方案
library(tidyverse)
df <- data.frame(x = LETTERS[1:3], year = c(2001,2004,2007))
df %>% mutate(nextYear = ifelse(is.na(lead(year)),year, lead(year)-1)) %>%
group_by(x) %>%
complete(year = seq(year, nextYear, by=1)) %>%
select(-nextYear) %>%
as.data.frame()
# x year
# 1 A 2001
# 2 A 2002
# 3 A 2003
# 4 B 2004
# 5 B 2005
# 6 B 2006
# 7 C 2007
答案 2 :(得分:2)
我们可以split
先x
,然后为每个year
群组创建x
向量,加入每个群组df
,{{1} } fill
,然后x
所有群组rbind
一起。
df
<强>结果:强>
library(dplyr)
library(tidyr)
df %>%
split(.$x) %>%
lapply(function(y) data.frame(year = min(y$year):max(y$year)) %>%
full_join(y) %>%
fill(x)) %>%
unname() %>%
do.call(rbind, .)
答案 3 :(得分:1)
这是一个非常简单的基础R方法tapply
和stack
。
stack(tapply(df$year, df["x"], function(x) min(x):max(x)))
在这里,tapply
将年矢量分成df$x
组,然后构建从最小年到最大年的序列。这将返回一个命名列表,该列表将被提供给stack
以生成以下内容。
values ind
1 2001 A
2 2002 A
3 2003 A
4 2004 A
5 2002 B
6 2003 B
7 2004 B
8 2005 B
如果您对如何在data.table
中执行此操作感到好奇,那么它也非常直接:
library(data.table)
setDT(df)[, .(year=min(year):max(year)), by=x]
返回
x year
1: A 2001
2: A 2002
3: A 2003
4: A 2004
5: B 2002
6: B 2003
7: B 2004
8: B 2005