R - 比较不同行中两列中的值

时间:2017-08-08 14:36:16

标签: r

我有一个数据框],如下所示,有两个功能,一个离境城市和一个到达城市。关于前进和返回航班存储每两行信息。

df

在重复相同航班的数据中存在一些不一致,因为在最后两行中可以看到。

如何比较第一行的出发城市和第二行的到达城市的每两行,并保持相等的行。 数据集非常大,当然for循环不是一种选择。

提前谢谢。

5 个答案:

答案 0 :(得分:3)

以下是一种使用headtail对行对进行比较的方法。

# 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)