首页 > 解决方案 > 将一个值与列中的下一个值进行比较

问题描述

我有以下形式的数据集:

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 函数都是矢量化的。这是在基础 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)) 

推荐阅读