R 如果只有一个特殊列中的行的实际值和后续值不相同,则从数据中提取行
我在使用R时遇到以下问题: 我有一个带有运行时间戳的数据,所以有很多行。 如果方向发生变化,则应将变化前后的整行提取到新表中 例如: 我所拥有的: 时间戳方向… 00:01前… 00:02前… 00:03前… 00:04前… 00:05侧面… 00:06侧面… 00:07侧面… 00:08侧面… 00:09侧面… 00:10前… 00:11前… 00:12前… 00:13前… 00:14回来… 00:15回来… 00:16回来… 00:17回来… 00:18回来… 00:19回来 我想要一张新桌子: 时间戳方向… 00:04前… 00:05侧面… 00:09侧面… 00:10前… 00:13前… 00:14回来 谁能帮我?我真的不知道从哪里开始。 我使用datadplyr::lag和dplyr::lead导入数据对于访问向量中的前面和后面的元素很有用。下面是一个使用这些工具以及中的其他数据争用工具的解决方案,如果您不熟悉该软件包,请参阅,例如,了解介绍;有关详细信息,请参见注释 图书馆弹琴 新的% 查找方向与上一行方向不同的行 变异..改变=方向!=滞后方向%>% 保留方向更改的行,以及每次更改前的行 筛选器..更改| lead..更改%>% 从数据中删除更改指示器 选择-…更改 刚出现的 >时间戳方向 >1 00:04前 >2 00:05侧面 >3 00:09侧面 >4点10分前 >5:00:13前 >6点14分回来 都是新的,想要吗 >[1]是的 编辑:您还可以通过使用类似于@storaged优雅答案的方法删除mutate和select: 新的% 过滤器方向!=方向|方向!=领导方向 注:关于上述内容,我阅读了您提供的如下数据片段: opdplyr看起来很酷,但我也建议一些基于逻辑运算的简单方法: 假设第二列包含方向,即数据[,2] 我会:R 如果只有一个特殊列中的行的实际值和后续值不相同,则从数据中提取行,r,select,dataframe,extract,rows,R,Select,Dataframe,Extract,Rows,我在使用R时遇到以下问题: 我有一个带有运行时间戳的数据,所以有很多行。 如果方向发生变化,则应将变化前后的整行提取到新表中 例如: 我所拥有的: 时间戳方向… 00:01前… 00:02前… 00:03前… 00:04前… 00:05侧面… 00:06侧面… 00:07侧面… 00:08侧面… 00:09侧面… 00:10前… 00:11前… 00:12前… 00:13前… 00:14回来… 00:15回来… 00:16回来… 00:17回来… 00:18回来… 00:19回来 我想要一张新桌
x <- data[,2]
y <- c(x[1], x[1:(length(x)-1)])
z <- c(x[2:length(x)], x[1])
谢谢你们两位的支持! 不幸的是,我在安装和使用软件包时遇到了一些问题,所以我无法尝试@MikkoMarttilas解决方案。仅仅使用@storaged代码,我也没有得到我所需要的,但我将这个想法与我的答案中的想法结合起来,所以这对我来说是有效的:
data <- read.table()
dat7 <- data[,7]
num.dat7 <- c(dat7[1], dat7[1:(length(dat7))])
w <- which(diff(num.dat7)!=0)
w1 <- w-1
after <- data.frame(data[w,])
before <- data.frame(data[w1,])
bind <- rbind(before, after)
我们可以使用rleid对具有相同方向值的连续条纹进行分组,并拾取每个条纹的第一个和最后一个值,而不是使用滞后和超前来识别方向的变化:
library(data.table)
setDT(df)[df[, .I[c(1L, .N)], by = rleid(direction)]$V1][-c(1L, .N)]
最后,根据OP的请求,从结果中删除第一条条纹的第一行和最后一条条纹的最后一行
如果您提供一份支持您的问题的报告,我们更有可能帮助您。我们可以利用它来向您展示如何回答您的问题。我还建议大家看一下。一般来说,证明你已经付出了一些努力也是很好的。
data <- read.table()
dat7 <- data[,7]
num.dat7 <- c(dat7[1], dat7[1:(length(dat7))])
w <- which(diff(num.dat7)!=0)
w1 <- w-1
after <- data.frame(data[w,])
before <- data.frame(data[w1,])
bind <- rbind(before, after)
library(data.table)
setDT(df)[df[, .I[c(1L, .N)], by = rleid(direction)]$V1][-c(1L, .N)]
Timestamp direction
1: 00:04 front
2: 00:05 side
3: 00:09 side
4: 00:10 front
5: 00:13 front
6: 00:14 back