避免在R中嵌套for循环,在多个条件下跨多个数据帧进行匹配

高地基础

这是我在做什么的一个例子。data.frame通常有成千上万的记录,并且使用条件我经常要满足更多条件if()

library(tidyverse)

# example df 1
coll <- data.frame(id = c("alpha", "alpha", "beta", "beta", "gamma", "delta", "epsilon"),
                   frequency = c("12.340", "23.340", "12.560", "15.670", "56.230", "12.890", "89.430"),
                   start = c("2010-01-01", "2015-01-01", "2011-02-02", "2017-02-02", rep("2019-01-01", 3)),
                   end = c("2011-02-02", NA, "2012-01-01", NA, "2018-02-02", rep(NA, 2))) %>%
  mutate(still.active = ifelse(!is.na(end), still.active <- "No", NA),
         reason = ifelse(!is.na(end), reason <- "Removed", NA)) %>% 
  mutate_all(as.character)

# example df 2
mort <- data.frame(id = c("alpha", "beta", "gamma", "delta", "zeta"),
                   frequency = c("23.340", "15.670", "56.230", "12.890", NA),
                   date = c("2016-01-01", "2018-01-01", rep("2020-01-01", 3)),
                   type = c(rep(1, 2), rep(2, 3))
                   ) %>%
  mutate_all(as.character)

for(i in 1:nrow(coll)){
  for(j in 1:nrow(mort)){
    if(coll$id[i] == mort$id[j] & # if these match
       coll$frequency[i] == mort$frequency[j] & # and these match
       is.na(coll$end[i]) & # and the value I want to fill in is currently blank
       mort$type[j] == "1" # and this other condition is met
    ){
      coll$end[i] <- as.character(mort$date[j]) # then assign these cells these values
      coll$still.active[i] <- "No"
      coll$reason[i] <- "Said so"
    }
  }
}

嵌套的for循环恰好满足了我的需要,但是在实践中,它们变得非常慢,我想学习一种更好的方法。如果只需要在两个data.frames中匹配一列的值,那么索引就很容易了,例如:

df <- data.frame(id = c("one", "two", "three")) %>% arrange(desc(id))

df2 <- data.frame(id = c("one", "two", "three"),
                   frequency = c("23.340", "15.670", "56.230"))

df$freq <- df2[match(df$id, df2$id), "frequency"]

但是我不确定在有更多条件时如何到达那里,即使可以,我认为其他人可能很难阅读并弄清楚发生了什么。我喜欢嵌套的for循环的一件事是它很容易阅读。也许我只是习惯他们。我可以ifelse()改为使用嵌套语句吗?还有哪些其他选择?

安德烈

可以使用left_joinifelse(或case_when完成此操作

coll %>% left_join(mort, by = "id") %>% 
mutate(tmp = (frequency.x == frequency.y) & is.na(end) & type == "1" ) %>% 
mutate(end = ifelse(tmp, as.character(date), end),
still.active = ifelse(tmp, "No", still.active),
reason = ifelse(tmp,"Said so", reason)) %>% 
select(id, frequency = frequency.x, start, end, still.active,reason)


       id frequency      start        end still.active  reason
1   alpha    12.340 2010-01-01 2011-02-02           No Removed
2   alpha    23.340 2015-01-01 2016-01-01           No Said so
3    beta    12.560 2011-02-02 2012-01-01           No Removed
4    beta    15.670 2017-02-02 2018-01-01           No Said so
5   gamma    56.230 2019-01-01 2018-02-02           No Removed
6   delta    12.890 2019-01-01       <NA>         <NA>    <NA>
7 epsilon    89.430 2019-01-01       <NA>         <NA>    <NA>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

避免在R中嵌套for循环,在多个条件下跨多个数据帧进行匹配

来自分类Dev

避免在R中嵌套for循环,在多个条件下跨多个数据帧进行匹配

来自分类Dev

避免在R中嵌套for循环,在多个条件下跨多个数据帧进行匹配

来自分类Dev

在没有For循环的情况下跨R中的数据帧进行匹配和分解

来自分类Dev

在一定条件下,将每一行的数据帧拆分为多个数据帧

来自分类Dev

在R中的2个数据帧之间通过多个条件进行索引

来自分类Dev

使用循环在R中创建多个数据帧

来自分类Dev

R 循环引用多个数据帧

来自分类Dev

如何在R中对多个数据帧进行排序

来自分类Dev

如何在多个条件下进行适当的for循环?

来自分类Dev

循环多个数据帧

来自分类Dev

R-将一个数据帧中的值与另一个数据帧中的多个值进行匹配

来自分类Dev

如何从R中具有多个条件的一个数据帧创建多个数据帧

来自分类Dev

如何在R的for循环中从多个数据帧中输出多个pdf文件

来自分类Dev

在R中的多个条件下子集一个数据框

来自分类Dev

子集匹配特定条件的列表中的多个数据帧

来自分类Dev

R - 使用嵌套循环重命名多个数据框中的多个列

来自分类Dev

在R中的多个条件下选择变量

来自分类Dev

R:循环浏览多个数据帧,保存到列表

来自分类Dev

在给定条件下跨多个列选择值

来自分类Dev

在多个数据帧上嵌套函数

来自分类Dev

将匹配函数重复应用于R中的多个数据帧

来自分类Dev

如何在R中的循环中将多个数据帧写入单个csv文件?

来自分类Dev

在多个条件下使用多个case语句进行联接

来自分类Dev

使用循环从多个数据帧的列中创建单个数据帧

来自分类Dev

使用循环创建多个数据帧

来自分类Dev

在循环中绑定多个数据帧

来自分类Dev

通过列表R中存储的多个数据帧运行条件

来自分类Dev

基于两个数据帧 R 中多个条件的特定列的值

Related 相关文章

  1. 1

    避免在R中嵌套for循环,在多个条件下跨多个数据帧进行匹配

  2. 2

    避免在R中嵌套for循环,在多个条件下跨多个数据帧进行匹配

  3. 3

    避免在R中嵌套for循环,在多个条件下跨多个数据帧进行匹配

  4. 4

    在没有For循环的情况下跨R中的数据帧进行匹配和分解

  5. 5

    在一定条件下,将每一行的数据帧拆分为多个数据帧

  6. 6

    在R中的2个数据帧之间通过多个条件进行索引

  7. 7

    使用循环在R中创建多个数据帧

  8. 8

    R 循环引用多个数据帧

  9. 9

    如何在R中对多个数据帧进行排序

  10. 10

    如何在多个条件下进行适当的for循环?

  11. 11

    循环多个数据帧

  12. 12

    R-将一个数据帧中的值与另一个数据帧中的多个值进行匹配

  13. 13

    如何从R中具有多个条件的一个数据帧创建多个数据帧

  14. 14

    如何在R的for循环中从多个数据帧中输出多个pdf文件

  15. 15

    在R中的多个条件下子集一个数据框

  16. 16

    子集匹配特定条件的列表中的多个数据帧

  17. 17

    R - 使用嵌套循环重命名多个数据框中的多个列

  18. 18

    在R中的多个条件下选择变量

  19. 19

    R:循环浏览多个数据帧,保存到列表

  20. 20

    在给定条件下跨多个列选择值

  21. 21

    在多个数据帧上嵌套函数

  22. 22

    将匹配函数重复应用于R中的多个数据帧

  23. 23

    如何在R中的循环中将多个数据帧写入单个csv文件?

  24. 24

    在多个条件下使用多个case语句进行联接

  25. 25

    使用循环从多个数据帧的列中创建单个数据帧

  26. 26

    使用循环创建多个数据帧

  27. 27

    在循环中绑定多个数据帧

  28. 28

    通过列表R中存储的多个数据帧运行条件

  29. 29

    基于两个数据帧 R 中多个条件的特定列的值

热门标签

归档