如果列A中的因子与列B中的因子匹配,如何删除行

时间:2019-06-02 17:01:16

标签: r dataframe int levels

我有一个包含900万行和3个变量的数据框。这3个变量分别是起点(具有46级的因子),目的地(具有46级的因子)和吞吐量(整数)。

我的数据框的简化版本如下所示: https://ibb.co/0p7g37B

我要删除Origin等于Destination的行(例如12th = 12th或16th = 16th)

我希望我的输出看起来像这样: https://ibb.co/k6h7qc2

数据:

df <- structure(list(Origin = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L
  ), .Label = c("12th", "16th"), class = "factor"), Destination = structure(c(1L, 
  1L, 4L, 4L, 2L, 3L, 5L), .Label = c("12th", "16th", "CIVC", "COLS", 
  "FTVL"), class = "factor"), Throughput = c(1L, 2L, 1L, 4L, 2L, 
  1L, 7L)), class = "data.frame", row.names = c(NA, -7L))

3 个答案:

答案 0 :(得分:1)

Bruno和Nitesh的答案都能产生期望的输出,但是我认为不需要多余的mutate语句。您可以直接过滤结果:

df <- df %>% filter(Origin != Destination)

另一件事:为了能够比较两个因子变量,它们应该具有相同的水平。您应以两种都具有相同级别的方式来编辑原始或目标变量的级别。

答案 1 :(得分:0)

您可以创建一个虚拟变量,其字符串值为1和0。如果源和目标值相同,则返回1,否则为0。然后,您可以在新创建的虚拟变量中过滤出字符串值为0的行。如下所示:

data = read.csv("filepath of csv file.csv")
data$newdummy = ifelse(data$Origin == data$Destination, '1' ,'0')
data1 <- data[data$newdummy == '0',]

稍后,您可以删除创建虚拟值的列-

data1 <- data1[-4] 

如果新的虚拟列的位置位于第3位。

希望有帮助。

答案 2 :(得分:0)

您可以使用tidyverse。

library(tidyverse)
df <- tribble(~Origin,~Destination,~Throughput,
             "12th","12th",1,
             "12th","12th",2,
             "12th","COLS",1,
             "12th","COLS",4,
             "16th","16th",2,
             "16th","CIVC",1,
             "16th","FTVL",7)

df %>%
  mutate(is_equal = if_else(Origin == Destination,
                                 TRUE,
                                 FALSE)) %>% 
  filter(is_equal == FALSE) %>% 
  select(-is_equal)