微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

确定一个值是否与之前匹配的组中的 id 匹配

如何解决确定一个值是否与之前匹配的组中的 id 匹配

我有一个数据框,其中包含按站点和 ID 分组的数据。我想创建一个带有逻辑值的新列,该列指示每个站点内的 id 是否与前一行中的角度匹配。

other.dat <- c(1:12)
site <- c(rep(1,6),rep(2,6))
id <- c(1.1,1.2,1.3,1.1,2.1,2.2,2.3,2.3)
angle <- c(65,250,150,65,240,345,205,100)
data.frame(other.dat,site,id,angle)

   other.dat site  id angle
1          1    1 1.1    65
2          2    1 1.2   250
3          3    1 1.3   150
4          4    1 1.1    65
5          5    1 1.2   250
6          6    1 1.3   150
7          7    2 2.1     0
8          8    2 2.2   240
9          9    2 2.3   150
10        10    2 2.1   345
11        11    2 2.2   205
12        12    2 2.3   100

与上一个问题中给出的示例不同 (Identify if a value is repeated or not by groups in R),角度不需要是站点唯一的逻辑变量为 TRUE 并且第一个唯一 id 将始终为 TRUE。例如:

other.dat <- c(1:12)
site <- c(rep(1,100)
same.angle <- c(T,T,F,F)
data.frame(other.dat,angle,same.angle)

   other.dat site  id angle same.angle
1          1    1 1.1    65       TRUE
2          2    1 1.2   250       TRUE
3          3    1 1.3   150       TRUE
4          4    1 1.1    65       TRUE
5          5    1 1.2   250       TRUE
6          6    1 1.3   150       TRUE
7          7    2 2.1     0       TRUE
8          8    2 2.2   240       TRUE
9          9    2 2.3   150       TRUE
10        10    2 2.1   345      FALSE
11        11    2 2.2   205      FALSE
12        12    2 2.3   100      FALSE

我曾尝试使用 df <- within(df,same.angle <- as.logical(angle,FUN = function(x) length(unique(x))==1))),但由于我还不明白的原因,只有第 7 行返回为“FALSE”。

预先感谢您的帮助!

解决方法

试试这个。您可以按所需变量分组,然后使用 lag() 复制行比较,然后比较以达到预期输出:

library(dplyr)
#Code
new <- df %>% group_by(site,id) %>%
  mutate(Var=lag(angle),Same.angle=ifelse(is.na(Var),T,ifelse(angle==Var,F))) %>%
  select(-Var)

输出:

# A tibble: 12 x 5
# Groups:   site,id [6]
   other.dat  site    id angle Same.angle
       <int> <dbl> <dbl> <dbl> <lgl>     
 1         1     1   1.1    65 TRUE      
 2         2     1   1.2   250 TRUE      
 3         3     1   1.3   150 TRUE      
 4         4     1   1.1    65 TRUE      
 5         5     1   1.2   250 TRUE      
 6         6     1   1.3   150 TRUE      
 7         7     2   2.1     0 TRUE      
 8         8     2   2.2   240 TRUE      
 9         9     2   2.3   150 TRUE      
10        10     2   2.1   345 FALSE     
11        11     2   2.2   205 FALSE     
12        12     2   2.3   100 FALSE   

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。