gpt4 book ai didi

r - 仅对每 N 行使用第一个匹配项

转载 作者:行者123 更新时间:2023-12-04 14:45:06 27 4
gpt4 key购买 nike

我有一个如下所示的 data.frame。

Date  Number
1 1
2 0
3 1
4 0
5 0
6 1
7 0
8 0
9 1

我想创建一个新列,如果它是每 3 行中的第一个 1,则在该列中放置一个 1。否则输入 0。例如,这就是我希望新的 data.frame 看起来的样子

Date  Number  New
1 1 1
2 0 0
3 1 0
4 0 0
5 0 0
6 1 1
7 0 0
8 0 0
9 1 1

每三行我们找到第一个 1 并填充该列,否则我们放置一个 0。谢谢。

嗯,乍一看,我认为 Akrun 的回答为我提供了解决方案。然而,这并不是我想要的。这是@akrun 解决方案提供的内容。

df1 = data.frame(Number = c(1,0,1,0,1,1,1,0,1,0,0,0))
head(df1,9)

Number
1 1
2 0
3 1
4 0
5 1
6 1
7 1
8 0
9 1

尝试解决方案:

df1 %>% 
group_by(grp = as.integer(gl(n(), 3, n()))) %>%
mutate(New = +(Number == row_number()))



Number grp New
<dbl> <int> <int>
1 1 1 1
2 0 1 0
3 1 1 0
4 0 2 0
5 1 2 0 #should be a 1
6 1 2 0
7 1 3 1
8 0 3 0
9 1 3 0

如您所见,代码错过了第 5 行的代码。我正在寻找每个 block 中的第一个 1。那么其他一切都应该是0。对不起,如果我不清楚 akrn

编辑** Akrun 的新答案正是我想要的。非常感谢

最佳答案

这是一个使用 gl 创建分组列的选项,然后在 的索引上使用 row_number 执行 == >matched 1. 这里,match 将只返回第一个匹配项的索引。

library(dplyr)
df1 %>%
group_by(grp = as.integer(gl(n(), 3, n()))) %>%
mutate(New = +(row_number() == match(1, Number, nomatch = 0)))
# A tibble: 12 x 3
# Groups: grp [4]
# Number grp New
# <dbl> <int> <int>
# 1 1 1 1
# 2 0 1 0
# 3 1 1 0
# 4 0 2 0
# 5 1 2 1
# 6 1 2 0
# 7 1 3 1
# 8 0 3 0
# 9 1 3 0
#10 0 4 0
#11 0 4 0
#12 0 4 0

关于r - 仅对每 N 行使用第一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62333904/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com