r - 如何生成一个 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 和学习的新手,请尽你所能提供帮助,我将不胜感激 :)
解决方案
为了“证明”我们正在保存“最近的行”,我将添加一个行号列。数据:
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 = ''))
推荐阅读
- verilog - SystemVerilog 连接分配不正确
- c++ - Bazel 链接器未找到函数定义
- appium - 如何让 Webdriverio 与 appium-desktop 检查器一起使用?
- webstorm - 如何在 WebStorm 控制台中禁用换行?
- asp.net-core - NavigationManager.Uri 根本不会更新,除非页面被刷新。如何在 Blazor Server 中获取真实的当前 URI?
- python - Django 模型:从两个选项中选择一个 FK(只有一个)
- java - Selenium Java Lib 未在 Gradle 中导入
- reactjs - 用 Meteor js 语法描述 React componentDidMount()
- javascript - ReactJS根据滚动到具有动态高度的部分更改导航栏颜色
- python - 用 Python 编写 Discord 机器人 - 如何让它过滤垃圾邮件?