R 中的 dplyr 突变 - 根据另一列的顺序添加新列
dplyr mutate in R - adding a new column depending on sequence of another column
我在 dplyr
中遇到 mutate
函数的问题。
- 我正在尝试
添加一个名为
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)
有没有优雅的方法来完成这个过程?
如果您知道 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]))
我在 dplyr
中遇到 mutate
函数的问题。
- 我正在尝试
添加一个名为
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)
有没有优雅的方法来完成这个过程?
如果您知道 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]))