![](/img/trans.png)
[英]R - Compare and keep values in the third column based on two columns in different rows
[英]R - Compare values in two columns in different rows
我有一个数据框df
,如下所示,具有两个功能,出发城市和到达城市。 每两行存储一次往返航班信息。
Departure Arrival
1 A B
2 B A
3 F G
4 G F
5 U V
6 V U
7 K L
8 K L
正如在最后两行中可以看到的那样,重复相同的飞行的数据中存在一些不一致之处。
如何每两行比较第一行的出发城市和第二行的到达城市,并保持相等。 数据集非常大,当然不考虑使用for循环。
先感谢您。
下面是比较对使用行的方法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"))
因此,您只想要独特的飞行路线吗? 有很多方法可以做到这一点,我认为最快的方法是使用data.table,例如:
library(data.table)
df <- as.data.table(df)
uniqueDf <- unique(df)
您还可以使用重复的功能,例如
df <- df[!duplicated(df), ]
应该做得很好。
您也可以这样进行:
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
如果适合您,请尝试以下解决方案:
df[duplicated(paste0(df$Departure,df$Arrival))==F,]
此答案不是在查找唯一记录,而是专门检查某行是否与之前的行重复。
如果行已重复,则添加带有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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.