【发布时间】:2026-02-18 09:55:01
【问题描述】:
需要您的帮助来解决循环问题;
示例数据:
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
一旦我们到达循环的最后一行 - 我们将没有行+1。在这种情况下:输出 = 上一行的 ID。
可以使用 dplyr & mutate 解决这个问题吗?如果是的话,很乐意将其作为可能的答案。
谢谢,
【问题讨论】:
-
我从字面上改变了关于您的循环的两件事 1)
sapply以返回结果和 2)%in%而不是==以更好地处理 NA,绝对没有理由引入这一项任务的包sapply(1:length(data2$ID), function(i) ifelse(data2[i,3] %in% 1, "Class A", ifelse(data2[i,3] %in% 2, "Class B", ifelse(data2[i,2] %in% data2[i+1,2], data2[i+1,1], data2[i-1,1])))) -
@rawr - 你也可以在没有循环或包的情况下做到这一点,尽管不是很漂亮:
data2$NewID <- NA;tband <- c(tail(data2$Band,-1),NA);lband <- data2$Band == tband;data2$NewID[which(lband)] <- c(tail(data2$ID,-1),NA)[which(lband)];data2$NewID[which(!lband)] <- c(NA,head(data2$ID,-1))[which(!lband)];data2$NewID[length(data2$NewID)] <- tail(data2$ID,2)[1];data2$NewID[data2$Group_qty == 1] <- "Class A";data2$NewID[data2$Group_qty == 2] <- "Class B" -
@thelatemail 纯洁造就了它的美丽
-
@rawr - 谢谢你们。我确实玩过 sapply & rapply,但无法让它工作。谢谢你告诉我怎么做。 :)
-
@J1975 抱歉,不知道我从来没有做过那种事。听起来像来自here,您可以发送一个请求,每个请求最多 100 个条目。但也可以将
&paginationInput.pageNumber=n添加到您的网址末尾并获取特定的页码,n。然后你可以遍历页码,直到没有更多结果,将列表组合成一个结果,然后进行聚合
标签: r if-statement for-loop dplyr