我有data.frame
这样:
df <- data.frame(x = c(998,994,992,990,989,988), y = seq(0.5, 3, by = 0.5))
df
x y
1 998 0.5
2 994 1.0
3 992 1.5
4 990 2.0
5 989 2.5
6 988 3.0
我想展开它,因此x中的值恰好相距1
,所以最终data.frame
看起来像这样:
x y
1 998 0.5
2 997 0.5
3 996 0.5
5 995 0.5
6 994 1.0
7 993 1.0
8 992 1.5
9 991 1.5
10 990 2.0
11 989 2.5
12 988 3.0
答案 0 :(得分:11)
您还可以使用approx
:
data.frame(approx(df, xout=max(df$x):min(df$x), method="constant", f=1))
x y
1 998 0.5
2 997 0.5
3 996 0.5
4 995 0.5
5 994 1.0
6 993 1.0
7 992 1.5
8 991 1.5
9 990 2.0
10 989 2.5
11 988 3.0
答案 1 :(得分:7)
您可以尝试使用包na.locf
中的函数zoo
:
all_values <- max(df$x):min(df$x)
na.locf(merge(df, x=all_values, all=TRUE)[rev(seq(all_values)),])
# x y
# 11 998 0.5
# 10 997 0.5
# 9 996 0.5
# 8 995 0.5
# 7 994 1.0
# 6 993 1.0
# 5 992 1.5
# 4 991 1.5
# 3 990 2.0
# 2 989 2.5
# 1 988 3.0
<强> NB 强>
根据@Ananta和@ProcrastinatusMaximus的建议,另一个选项是在fromLast=TRUE
调用中设置na.locf
(如果您需要按降序排列x,则需要对其进行排序data.frame之后):
na.locf(merge(df, x=all_values, all=TRUE), fromLast=TRUE)