R中的高级行删除
advanced row deleting in R
我希望根据高级选择逻辑(即不仅仅是一个简单的子集)在 R 中删除行。这是一些示例代码和我需要做的事情
v1 <- c(1:11)
v2 <- c('a','a','b','b','b','b','c','c','c','c','c')
v3 <- c(3,13,14,13,14,9,14,13,14,13,14)
v4 <- c('','x','','','','x','','','','','x')
v5 <- c('','x','','y','','x','','y','','y','x')
test.df <- data.frame(v1,v2,v3,v4,v5)
names(test.df) <- c('id','level','number','end_flag','logic_flag')
我想要做的是删除第一个逻辑标志等于 'y'.
下面每个特定级别的所有行
所以在这种情况下,最终结果应该不会删除级别 a 的任何行、级别 b 的第 5 和 6 行以及级别 c 的第 9、10、11 行。
基本上,想要使 end_flag 每个级别的数字列中出现的第一个“13”等于 'x',然后删除 'x' 下该级别的所有行=24=] = 'x'
让我知道这是否有意义,因为我需要在继续我的其余代码之前清理这部分!
谢谢!
使用dplyr
你可以做到
library(dplyr)
test.df %>% group_by(level) %>%
filter(head(cumsum(c(F, logic_flag == 'y')) == 0, -1))
# id level number end_flag logic_flag
# 1 1 a 3
# 2 2 a 13 x x
# 3 3 b 14
# 4 4 b 13 y
# 5 7 c 14
# 6 8 c 13 y
首先,按级别分组,然后删除我们已经看到 "y" 的行(使用 cumsum
)。 F
附加到 cumsum
向量,因为我们想要包括包含 "y" 的第一行。由于向量的长度增加了 1,因此 head(..., -1)
用于删除最后一个元素。我认为 dplyr
有一些 lag
函数也可以做类似的事情。
Base R
使用 cumsum
两次:
posty <- function(x) cumsum(cumsum(x))<=1
test.df[with(test.df, ave(logic_flag=="y", level, FUN=posty)),]
# id level number end_flag logic_flag
#1 1 a 3
#2 2 a 13 x x
#3 3 b 14
#4 4 b 13 y
#7 7 c 14
#8 8 c 13
我希望根据高级选择逻辑(即不仅仅是一个简单的子集)在 R 中删除行。这是一些示例代码和我需要做的事情
v1 <- c(1:11)
v2 <- c('a','a','b','b','b','b','c','c','c','c','c')
v3 <- c(3,13,14,13,14,9,14,13,14,13,14)
v4 <- c('','x','','','','x','','','','','x')
v5 <- c('','x','','y','','x','','y','','y','x')
test.df <- data.frame(v1,v2,v3,v4,v5)
names(test.df) <- c('id','level','number','end_flag','logic_flag')
我想要做的是删除第一个逻辑标志等于 'y'.
下面每个特定级别的所有行所以在这种情况下,最终结果应该不会删除级别 a 的任何行、级别 b 的第 5 和 6 行以及级别 c 的第 9、10、11 行。
基本上,想要使 end_flag 每个级别的数字列中出现的第一个“13”等于 'x',然后删除 'x' 下该级别的所有行=24=] = 'x' 让我知道这是否有意义,因为我需要在继续我的其余代码之前清理这部分!
谢谢!
使用dplyr
你可以做到
library(dplyr)
test.df %>% group_by(level) %>%
filter(head(cumsum(c(F, logic_flag == 'y')) == 0, -1))
# id level number end_flag logic_flag
# 1 1 a 3
# 2 2 a 13 x x
# 3 3 b 14
# 4 4 b 13 y
# 5 7 c 14
# 6 8 c 13 y
首先,按级别分组,然后删除我们已经看到 "y" 的行(使用 cumsum
)。 F
附加到 cumsum
向量,因为我们想要包括包含 "y" 的第一行。由于向量的长度增加了 1,因此 head(..., -1)
用于删除最后一个元素。我认为 dplyr
有一些 lag
函数也可以做类似的事情。
Base R
使用 cumsum
两次:
posty <- function(x) cumsum(cumsum(x))<=1
test.df[with(test.df, ave(logic_flag=="y", level, FUN=posty)),]
# id level number end_flag logic_flag
#1 1 a 3
#2 2 a 13 x x
#3 3 b 14
#4 4 b 13 y
#7 7 c 14
#8 8 c 13