r - 将一个值与列中的下一个值进行比较
问题描述
我有以下形式的数据集:
Interval | Count | criteria
0 0 0
0 1 0
0 2 0
0 3 0
1 4 1
1 5 2
1 6 3
1 7 4
2 8 1
2 9 2
3 10 3
我需要比较区间中的值。我首先需要创建一个新变量来存储这些值。如果 Interval 中的值与下一个值相同,则新变量应该有空格。如果 Interval 值与下一个值不同,则应返回条件/计数。输出应该是这样的:
Interval | Count | criteria | N
0 0 0
0 1 0
0 2 0
0 3 0 0
1 4 1
1 5 2
1 6 3
1 7 4 0.5714
2 8 1
2 9 2 0.2222
3 10 3
这是我的代码:
fid$N<-''
for (i in 1:length(fid$Interval))
{
if (fid$Interval[i] != fid$Interval[i+1])
fid$N<-fid$criteria/fid$Count
else
fid$N<-''
}
这是我得到的错误。
if (fid$Interval[i] != fid$Interval[i + 1]) fid$N <- fid$criteria/fid$Count else fid$N <- "" 出错:需要 TRUE/FALSE 的地方缺少值
补充一点,数据集中没有缺失值。
如果有人可以提供帮助,我将不胜感激。
解决方案
你不一定需要一个循环,因为大多数 R 函数都是矢量化的。这是在基础 R 中执行此操作的一种方法,dplyr
无需data.table
使用循环。
#Base R
transform(df, N = ifelse(Interval != c(tail(Interval, -1), NA), criteria/Count, NA))
#dplyr
library(dplyr)
df %>% mutate(N = if_else(Interval != lead(Interval), criteria/Count, NA_real_))
#data.table
library(data.table)
setDT(df)[, N:= fifelse(Interval != shift(Interval, type = 'lead'), criteria/Count, NA_real_)]
所有这些都返回:
# Interval Count criteria N
#1 0 0 0 NA
#2 0 1 0 NA
#3 0 2 0 NA
#4 0 3 0 0.0000000
#5 1 4 1 NA
#6 1 5 2 NA
#7 1 6 3 NA
#8 1 7 4 0.5714286
#9 2 8 1 NA
#10 2 9 2 0.2222222
#11 3 10 3 NA
我返回NA
而不是空白值,因为如果我们返回空白值,整个列将变为字符类型,并且数字不再有用。在答案中,您可以替换NA
为''
以获得空白值。
数据
df <- structure(list(Interval = c(0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 2L,
2L, 3L), Count = 0:10, criteria = c(0L, 0L, 0L, 0L, 1L, 2L, 3L,
4L, 1L, 2L, 3L)), class = "data.frame", row.names = c(NA, -11L))
推荐阅读
- javascript - 如何在 JS 中过滤 JSON 数据
- php - 在查询结果或查询比较中包含列名
- ruby-on-rails-5.2 - 按常用列关联关闭 3 个模型
- javascript - AngularJS ng-repeat orderBy / filter:在一种情况下调用后端的函数,在其他情况下在前端排序
- javascript - JavaScript 变量作用域
- arrays - 无法在 Vue 中响应实例
- java - NetBeans java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory] 在 javax.xml.bind.JAXB.unmarshal(JAXB.java:171)
- microsoft-graph-api - 无法通过事件字段 $select 和 $filter 消息
- php - 检查一个数字是否是另一个数字的倍数
- javascript - 将货币紧凑表示法(例如 '$1.5k')转换为整数(例如 1500)