我有一个数据框]
,如下所示,有两个功能,一个离境城市和一个到达城市。关于前进和返回航班存储每两行信息。
df
在重复相同航班的数据中存在一些不一致,因为在最后两行中可以看到。
如何比较第一行的出发城市和第二行的到达城市的每两行,并保持相等的行。 数据集非常大,当然for循环不是一种选择。
提前谢谢。
答案 0 :(得分:3)
以下是一种使用head
和tail
对行对进行比较的方法。
# find Departures that match the Arrival in the next row
sames <- which(head(dat$Departure, -1) == tail(dat$Arrival, -1))
# keep pairs of rows that match, maintaining order with `sort`
dat[sort(unique(c(sames, (sames + 1)))),]
Departure Arrival
1 A B
2 B A
3 F G
4 G F
5 U V
6 V U
请注意,两个变量必须是字符向量,而不是因子变量。如果需要,你可以使用as.character
强迫他们加入角色。
数据强>
dat <-
structure(list(Departure = c("A", "B", "F", "G", "U", "V", "K",
"K"), Arrival = c("B", "A", "G", "F", "V", "U", "L", "L")), .Names = c("Departure",
"Arrival"), class = "data.frame", row.names = c("1", "2", "3",
"4", "5", "6", "7", "8"))
答案 1 :(得分:1)
所以你只想要独特的飞行路径?有很多方法可以做到这一点,我认为最快的是data.table,如:
library(data.table)
df <- as.data.table(df)
uniqueDf <- unique(df)
您也可以使用复制功能,例如
df <- df[!duplicated(df), ]
应该做得很好。
答案 2 :(得分:1)
你也可以这样做:
right = rep(df[c(T,F),"Arrival"]==df[c(F,T),"Departure"],each=2)
df[right,]
返回:
Departure Arrival
1 A B
2 B A
3 F G
4 G F
5 U V
6 V U
答案 3 :(得分:0)
如果适用于您,请尝试以下解决方案:
df[duplicated(paste0(df$Departure,df$Arrival))==F,]
答案 4 :(得分:0)
此答案不会查找唯一记录,它会专门检查行之前是否与该行重复。
如果行重复,则添加一个带有1的新列:
for(i in 2:length(df$Departure)){df$test[i]=ifelse(df$Departure[i] == df$Departure[i-1] & df$Arrival[i] == df$Arrival[i-1], 1,0)}
循环可能会很慢:
library(data.table)
df$test2 = ifelse(df$Departure == shift(df$Departure) & df$Arrival == shift(df$Arrival), 1,0)