需要您的帮助来解决循环问题;
示例数据:
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 一起使用的工作循环或函数。 规则:
如果 Group_qty = 1;输出 = A 类
如果 Group_qty = 2;输出 = B 类
否则,检查 Band 是否与下一行的 Band 匹配。
- 如果是,输出 = 下一行的 ID
- 如果否,输出 = 上一行的 ID
一旦到达循环的最后一行 - 我们将不会有 row+1。在这种情况下:输出 = 上一行的 ID。
可以使用 dplyr & mutate 解决这个问题吗?如果是,我很乐意将其作为可能的答案。
谢谢
最佳答案
我们可以使用data.table
。将 'data.frame' 转换为 'data.table' (setDT(data2)
),按 'Band' 分组,if
组中的元素数量更大大于 1 (.N >1
),我们使用 shift
和 type='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/