Rank Values
1 e
2 er
3 gr
4 ie
5 wv
1 iop
1 ni
2 ot
3 kr
4 lw
我在数据帧中有一列“ rank”,我想添加获取行为1的行,并检查它们之后是否有2。如何在for循环中执行此操作?我知道可以使用if语句完成此操作,但我不确定如何获取正确的行?我基本上需要删除排名为1且没有以下排名2的行。
示例输出:
Rank NewCol
1 e
2 er
3 gr
4 ie
5 wv
1 ni
2 ot
3 kr
4 lw
(摆脱了iop,因为它的排名是1,之后没有2)
答案 0 :(得分:2)
data[!(data$Rank == 1 & c(data$Rank[-1], 0) != 2), ]
Rank Values
1 1 e
2 2 er
3 3 gr
4 4 ie
5 5 wv
7 1 ni
8 2 ot
9 3 kr
10 4 lw
或使用data.table
:
setDT(data)[!(Rank == 1 & shift(Rank, fill = 0, type = "lead") != 2)]
其中
data <- structure(list(Rank = c(1L, 2L, 3L, 4L, 5L, 1L, 1L, 2L, 3L, 4L
), Values = c("e", "er", "gr", "ie", "wv", "iop", "ni", "ot",
"kr", "lw")), row.names = c(NA, -10L), class = "data.frame")
答案 1 :(得分:1)
在寻找循环时:
data=c()
for(i in 1:nrow(df)){
if(i!=nrow(df)){
if(df$Rank[i]==1 & df$Rank[i+1]!=2){
# Ignore the iteration if it doesn't have a following rank 2
}
else{
data=rbind(data,df[i,]) # Else rbind the data to data.frame
}
}
else{
data=rbind(data,df[i,])
}
}
输出:
Rank Values
1 1 e
2 2 er
3 3 gr
4 4 ie
5 5 wv
7 1 ni
8 2 ot
9 3 kr
10 4 lw
答案 2 :(得分:1)
循环样式
我们将遍历数据框并注意在向量中需要删除哪些行。
示例数据框
(df <- data.frame(
Rank = c(1,2,3,1,2,1,1,2,1,1,1,2,3),
Values = letters[1:13]
))
这是代码
rows.to.delete <- c()
for( i in seq_along(df$Rank) ) {
if(df[i + 1, "Rank"] == 1 & df[i, "Rank"] == 1){
rows.to.delete <- c(rows.to.delete, i)
}
}
df[-rows.to.delete,]
括号样式
df[ ! (df$Rank == 1 & df$Rank[-1] == 1), ]
这很简洁,但不那么富有表现力...
关于此内容,请在“中”上阅读以下post
答案 3 :(得分:1)
我们也可以使用tidyverse
library(tidyverse)
df1 %>%
filter(!(Rank ==1 & lead(Rank, default = last(Rank)) != 2))
# Rank Values
#1 1 e
#2 2 er
#3 3 gr
#4 4 ie
#5 5 wv
#6 1 ni
#7 2 ot
#8 3 kr
#9 4 lw