a b c d
5015 3.49 1059.500 0.00
5023 2.50 6056.000 2.50
5024 3.00 1954.500 3.00
5026 3.49 1163.833 0.00
5037 2.50 6797.000 2.50
5038 3.00 2109.000 3.00
5040 2.50 4521.000 2.50
5041 3.33 2469.000 3.33
我想在行非零值d之前重复先前观察到的行0。所以,我会得到行的替换行,其中零值为d,然后是非零值d。 d值为零的行必须先前观察到行。
我想要的输出是:
a b c d
5015 3.49 1059.500 0.00
5023 2.50 6056.000 2.50
5015 3.49 1059.500 0.00
5024 3.00 1954.500 3.00
5026 3.49 1163.833 0.00
5037 2.50 6797.000 2.50
5026 3.49 1163.833 0.00
5038 3.00 2109.000 3.00
5026 3.49 1163.833 0.00
5040 2.50 4521.000 2.50
5026 3.49 1163.833 0.00
5041 3.33 2469.000 3.33
答案 0 :(得分:2)
我们可以创建一个自定义函数f
,它将交错第一行。在cumsum(d == 0)
上拆分,为等于0的值创建索引。最后,我们与do.call(rbind, ...)
结合使用。我添加了一个可选的'row.names<-'(..., NULL)
调用来撤消默认的命名约定:
f <- function(x) x[c(rbind(rep(1,nrow(x)-1), 2:nrow(x))),]
`row.names<-`(do.call(rbind, lapply(split(df1, cumsum(df1$d == 0)), f)), NULL)
# a b c d
# 1 5015 3.49 1059.500 0.00
# 2 5023 2.50 6056.000 2.50
# 3 5015 3.49 1059.500 0.00
# 4 5024 3.00 1954.500 3.00
# 5 5026 3.49 1163.833 0.00
# 6 5037 2.50 6797.000 2.50
# 7 5026 3.49 1163.833 0.00
# 8 5038 3.00 2109.000 3.00
# 9 5026 3.49 1163.833 0.00
# 10 5040 2.50 4521.000 2.50
# 11 5026 3.49 1163.833 0.00
# 12 5041 3.33 2469.000 3.33
那里有一个交错技巧。尝试c(rbind(c(1,1,1), c(2,3,4)))
查看数字编组的方式
答案 1 :(得分:2)
包data.table的分组在这里很有用:
library(data.table)
DF <-fread(" a b c d
5015 3.49 1059.500 0.00
5023 2.50 6056.000 2.50
5024 3.00 1954.500 3.00
5026 3.49 1163.833 0.00
5037 2.50 6797.000 2.50
5038 3.00 2109.000 3.00
5040 2.50 4521.000 2.50
5041 3.33 2469.000 3.33")
DF[ #find indices:
DF[, {ind <- .I[rep(1L, (.N - 1) * 2)] #first repeat the first index
ind[c(FALSE, TRUE)] <- .I[-1] #then replace every second repeat with the other indices
ind
}, by = cumsum(abs(d) < .Machine$double.eps^0.5)][["V1"]] #group by the different d = 0 rows,
#beware of floating point errors if you have calculated d
] #subset with the indices
# a b c d
# 1: 5015 3.49 1059.500 0.00
# 2: 5023 2.50 6056.000 2.50
# 3: 5015 3.49 1059.500 0.00
# 4: 5024 3.00 1954.500 3.00
# 5: 5026 3.49 1163.833 0.00
# 6: 5037 2.50 6797.000 2.50
# 7: 5026 3.49 1163.833 0.00
# 8: 5038 3.00 2109.000 3.00
# 9: 5026 3.49 1163.833 0.00
# 10: 5040 2.50 4521.000 2.50
# 11: 5026 3.49 1163.833 0.00
# 12: 5041 3.33 2469.000 3.33