R 中的 dplyr 突变 - 根据另一列的顺序添加新列

dplyr mutate in R - adding a new column depending on sequence of another column

我在 dplyr 中遇到 mutate 函数的问题。

错误:无法复制大小为 8064 的向量

这是 md df:

的可重现示例
df <- data.frame (
    No=(No= rep(seq(0,95,1),times=84)), 
    AC= rep(rep(c(78,110),each=1),times=length(No)/2), 
    AR = rep(rep(c(256,320,384),each=2),times=length(No)/6), 
    AM =  rep(1,times=length(No)),
    DQ = rep(rep(seq(0,15,1),each=6),times=84),
    V = rep(rep(seq(100,2100,100),each=96),times=4),
    R = sort(replicate(6, sample(5000:6000,96))))

labels  <- rep(c("CAP-CAP","CP-CAP","CAP-CP","CP-CP"),each=2016) 

我特意在此处添加了 2016 值,因为我知道每个数据集的行数。

但我想在数据集发生变化时为这些标签分配自动功能。因为对于我的真实文件,每个 df 的总行数可能会发生变化。对于这个问题,想想它只有一个 txt 文件,也想想有很多行数不同的文件。但是格式是一样的。

我用dplyr来安排我的df

library("dplyr")
newdf<-df%>%mutate_each(funs(as.numeric))%>%
mutate(state = labels)

有没有优雅的方法来完成这个过程?

如果您知道 df 中包含的数据集的数量以及您要关闭的列 --- 在这里,V --- 在 df 中排序,就像在您的中一样玩具数据,然后这有效。它非常笨重,应该有办法让它更有效率,但它产生了我认为是期望的结果:

# You'll need dplyr for the lead() part
library(dplyr)
# Make a vector with the labels for your subsets of df
labels <- c("AP-AP","P-AP","AP-P","P-P")
# This line a) produces an index that marks the final row of each subset in df
# with a 1 and then b) produces a vector with the row numbers of the 1s
endrows <- which(grepl(1, with(df, ifelse(lead(V) - V < 0, 1, 0))))
# This line uses those row numbers or the differences between them to tell rep()
# how many times to repeat each label
newdf$state <- c(rep(labels[1], endrows[1]), rep(labels[2], endrows[2] - endrows[1]),
    rep(labels[3], endrows[3] - endrows[2]), rep(labels[4], nrow(newdf) - endrows[3]))