Rp中的dplyr mutate - 根据另一列的顺序添加新列

时间:2015-08-02 05:46:21

标签: r dataframe dplyr tidyr

我在mutate中遇到dplyr功能问题。

  • 我想 添加一个名为state的新列,具体取决于其中一列(V列)的更改。 (V列重复序列,因此每个序列(rep(seq(100,2100,100),each=96)对应于df中的一个数据集

错误:无法复制大小为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)

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

1 个答案:

答案 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]))