r:何时使用 if else 循环与函数

标签 r if-statement for-loop dplyr

需要您的帮助来解决循环问题;

示例数据:

data2 <- structure(list(a = c(101, 102, 103, 104, 105, 106, 107, 108,109,110), 
                         b = c(1,1,1,1,2,2,3,4,4,4),
                         c = c(4, 4, 4, 4, 2, 2, 1, 3,3,3)), 
          .Names = c("ID", "Band", "Group_qty"), row.names = c(NA, 10L), class = "data.frame")

所需输出示例:

Output <- structure(list(a = c(101, 102, 103, 104, 105, 106, 107, 108, 109, 110), 
                          b = c(1,1,1,1,2,2,3,4,4,4),
                          c = c(4,4,4,4,2,2,1,3,3,3),
                          d = c(102,103,104,103,"Class B","Class B","Class A",109,110,109)), 
                     .Names = c("ID", "Band", "Group_qty","NewID"), row.names = c(NA, 10L), class = "data.frame")

if else 语句草稿: 注意:这不起作用。

data2$NewID <- 
  for(i in 1:length(data2$ID))
  {
    ifelse(data2$[i,3] == 1, "Class A", ifelse(data2[i,3] == 2, "Class B", ifelse(data2[i,2] == data2[i+1,2], data2[i+1,1], data2[i-1,1])))
  }

问题:

如何创建可与 dplyr 一起使用的工作循环或函数。 规则:

  1. 如果 Group_qty = 1;输出 = A 类

  2. 如果 Group_qty = 2;输出 = B 类

  3. 否则,检查 Band 是否与下一行的 Band 匹配。

    • 如果是,输出 = 下一行的 ID
    • 如果否,输出 = 上一行的 ID
  4. 一旦到达循环的最后一行 - 我们将不会有 row+1。在这种情况下:输出 = 上一行的 ID。

  5. 可以使用 dplyr & mutate 解决这个问题吗?如果是,我很乐意将其作为可能的答案。

谢谢

最佳答案

我们可以使用data.table。将 'data.frame' 转换为 'data.table' (setDT(data2)),按 'Band' 分组,if 组中的元素数量更大大于 1 (.N >1),我们使用 shifttype='lead' 来获取每个组的后续“ID”或else 保留“ID”以创建“NewID”列。然后,根据条件,我们使用 ifelse 将 'NewID' 中与 'Group_qty' 2 对应的值替换为 'Class B',将 1 替换为 'Class_A'。

library(data.table) 
setDT(data2)[, NewID:=if(.N>1) shift(ID, type='lead', 
                       fill = ID[.N-1]) else ID , by = .(Band)]
 data2[, NewID:= ifelse(Group_qty==2, 'Class B', 
                 ifelse(Group_qty==1, 'Class A', NewID))]
data2
#     ID Band Group_qty   NewID
# 1: 101    1         4     102
# 2: 102    1         4     103
# 3: 103    1         4     104
# 4: 104    1         4     103
# 5: 105    2         2 Class B
# 6: 106    2         2 Class B
# 7: 107    3         1 Class A
# 8: 108    4         3     109
# 9: 109    4         3     110
#10: 110    4         3     109

我们可以对 dplyr 使用类似的方法

library(dplyr)
data2 %>%
    group_by(Band) %>% 
    mutate(NewID = if(n()==1) ID else dplyr::lead(ID, 
                         default= ID[n()-1]), 
           NewID= ifelse(Group_qty==2, 'Class B', 
                  ifelse(Group_qty==1, 'Class A', 
                        as.character(NewID))))
#     ID  Band Group_qty   NewID
#   (dbl) (dbl)     (dbl)   (chr)
#1    101     1         4     102
#2    102     1         4     103
#3    103     1         4     104
#4    104     1         4     103
#5    105     2         2 Class B
#6    106     2         2 Class B
#7    107     3         1 Class A
#8    108     4         3     109
#9    109     4         3     110
#10   110     4         3     109

关于r:何时使用 if else 循环与函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35262109/

相关文章:

r - 更新 shiny 中 actionButton 的标签

python - Random.randint 在 Python 中不生成随机数

java - 安卓Java : Using setOnClickListener in for loop

r - 将 rpois 和 rnbinom 与 dplyr 命令一起使用

r - 如何使用带 rmarkdown 的单位包获取 pdf 文档

ios - Swift - 如果语句不能正常工作

java - while 循环内的 if/else 语句

java - 为什么我的嵌套 HashMap 将所有值设置为相同的值?

java - 循环中的多个jlabel,java

r - 在 Shiny 的应用程序中嵌入图像