我在mutate
中遇到dplyr
功能问题。
state
的新列,具体取决于其中一列(V
列)的更改。 (V列重复序列,因此每个序列(rep(seq(100,2100,100),each=96)
对应于df
中的一个数据集以下是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)
有没有优雅的方法来完成这个过程?
答案 0 :(得分:1)
如果您知道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]))