gpt4 book ai didi

r - 用于创建条纹列的 for 循环的替代方法

转载 作者:行者123 更新时间:2023-12-04 10:46:42 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

 x <- data.frame("Name" = c("Jorge", "Jorge", "Jorge", "Tom", "Tom", "Jerry", "Tom", "Tom", "Jorge"),
"Date" = c("10-13-2017", "10-12-2017", "10-11-2017", "10-10-2017", "10-09-2017",
"10-08-2017", "10-07-2017", "10-06-2017", "10-05-2017"))

我想创建一个列来计算名称列中名称的“连胜”。我想要的最终结果如下所示:

 Name       Date  Streak
Jorge 10-13-2017 3
Jorge 10-12-2017 2
Jorge 10-11-2017 1
Tom 10-10-2017 2
Tom 10-09-2017 1
Jerry 10-08-2017 1
Tom 10-07-2017 2
Tom 10-06-2017 1
Jorge 10-05-2017 1

我目前拥有的是:

streak <- 1
for(i in NROW(x):2){

j <- i - 1

if(as.character(x[i, "Name"]) == as.character(x[j, "Name"])){
streak = streak + 1
x[i, "Streak"] = streak
}

else{
x[i, "Streak"] = 1
streak <- 1
}
}

这给出:

 Name       Date  Streak
Jorge 10-13-2017 3
Jorge 10-12-2017 3
Jorge 10-11-2017 2
Tom 10-10-2017 1
Tom 10-09-2017 2
Jerry 10-08-2017 1
Tom 10-07-2017 1
Tom 10-06-2017 2
Jorge 10-05-2017 1

这是不对的,我正在努力弄清楚如何获得预期的输出。理想情况下我不需要使用 for 循环,因为这是一个有数万行的大型数据集,所以它非常慢。

所以我的问题:

1.有没有办法不使用 for 循环来做到这一点?
2.如何从底部开始计数,以便输出反射(reflect)所需的连胜数?

感谢您的帮助。

最佳答案

您可以使用 rle 函数(运行长度编码)在 base R 中执行此操作...

x$Streak <- unlist(sapply(rle(as.character(x$Name))$lengths, seq, 1, -1))

x
Name Date Streak
1 Jorge 10-13-2017 3
2 Jorge 10-12-2017 2
3 Jorge 10-11-2017 1
4 Tom 10-10-2017 2
5 Tom 10-09-2017 1
6 Jerry 10-08-2017 1
7 Tom 10-07-2017 2
8 Tom 10-06-2017 1
9 Jorge 10-05-2017 1

这会获取每个名称的运行长度,为每个名称生成一个倒数到 1 的序列,然后(通过取消列出)将它们变成一个向量。

关于r - 用于创建条纹列的 for 循环的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46740105/

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