首页 > 解决方案 > 如何生成一个 if 语句来比较 R 中的行

问题描述

我需要比较数据框中一列中相邻的两行,如果这两行中的数据匹配,则保存最近的行,例如


# Animals
# 1  dog  

# 2  cat  

# 3  cat  

它应该比较狗和猫,然后不保存任何数据。所以它不会保存第 1 行和第 2 行。

但是当它开始比较 cat 和 cat 时,意识到它们是相同的并保存这些行。所以保存第 2 行和第 3 行。因为它们是相同的。还有其他几列,但动物列是我唯一需要用来决定是否保存该行的列。但是,我想将列中的所有数据保留在已保存的行中。我需要对很多行执行此操作,迭代以比较一大组数据(~68,000)

我试图生成一个 if 语句,其中:

# results <- list()
# 
#  if(isTRUE(data$Animals[i+1] == data$Animals[i])) {
#   output <- print(data$Animals[i+1])
#   results[[i+1]] <- output
#   output <- print(data$Animals[i])
#   results[[i]] <- output
#  }
#}

然后我将此结果列表转换为数据框以进行进一步操作。然而,这种方法只为我提供了动物名称,我希望它保存了整行。我不太确定如何实现这一点,我一直在尝试编辑该语句,但似乎无法使其正常工作。

我是 R 和学习的新手,请尽你所能提供帮助,我将不胜感激 :)

标签: rloopsif-statement

解决方案


为了“证明”我们正在保存“最近的行”,我将添加一个行号列。数据:

dat <- structure(list(Animals = c("dog", "cat", "cat"), row = 1:3), row.names = c(NA, -3L), class = "data.frame")
dat
#   Animals row
# 1     dog   1
# 2     cat   2
# 3     cat   3

碱基R

dat[c(with(dat, Animals[-nrow(dat)] != Animals[-1])),,drop=FALSE]
#   Animals row
# 1     dog   1
# 3     cat   3

dplyr

library(dplyr)
dat %>%
  filter(Animals != lead(Animals, default = ''))
#   Animals row
# 1     dog   1
# 2     cat   3

我对此唯一要注意的是,如果包加载完全是无序的,那么两者都存在stats::filter并且stats::lag行为完全不同。如果您看到奇怪的结果,请尝试预先dplyr::确保它不是我使用哪个功能的问题。

dat %>%
  dplyr::filter(Animals != dplyr::lead(Animals, default = ''))

推荐阅读