gpt4 book ai didi

r - 我是 R 中编码的新手,无法为问题创建循环

转载 作者:行者123 更新时间:2023-12-01 23:02:54 25 4
gpt4 key购买 nike

我有以下信息:

Policy No      Amount     Info (1)    Info (2)     Info (3)     Info (4)   Info (5)
1001 100 500001 500002 500003 999999 999999
1002 200 600001 600002 999999 999999 999999
1003 300 700001 700002 700003 700004 700005

以上是信息的提供方式。

这就是我希望它的表示方式:

Policy No      Amount       Info
1001 100 500001
1001 100 500002
1001 100 500003
1002 200 600001
1002 200 600002
1003 300 700001
1003 300 700002
1003 300 700003
1003 300 700004
1003 300 700005

基本上,我想检查行中的每个信息列,如果有 999999,则转到下一行并生成直到信息列有 999999 的值。

我有超过 100,000 个这样的保单编号和金额信息。

非常感谢您的帮助。

最佳答案

使用 tidyverse 循环的可能替代方法:

library(tidyverse)

df %>%
mutate(across(everything(), ~na_if(.x, 999999))) %>%
pivot_longer(-c(`Policy No`, `Amount`), names_to = NULL, values_drop_na = TRUE)

输出

   `Policy No` Amount  value
<int> <int> <int>
1 1001 100 500001
2 1001 100 500002
3 1001 100 500003
4 1002 200 600001
5 1002 200 600002
6 1003 300 700001
7 1003 300 700002
8 1003 300 700003
9 1003 300 700004
10 1003 300 700005

或者如果你想坚持使用 for 循环,那么你可以这样做:

output <- NULL

for (i in names(df[,-c(1:2)])) {
x <- df[which(df[,i] != 999999), c("Policy No", "Amount",i)]
names(x)[3] <- "Info"
output <- rbind(output, x)
}

数据

df <- structure(list(`Policy No` = 1001:1003, Amount = c(100L, 200L, 
300L), `Info (1)` = c(500001L, 600001L, 700001L), `Info (2)` = c(500002L,
600002L, 700002L), `Info (3)` = c(500003L, 999999L, 700003L),
`Info (4)` = c(999999L, 999999L, 700004L), `Info (5)` = c(999999L,
999999L, 700005L)), class = "data.frame", row.names = c(NA,
-3L))

关于r - 我是 R 中编码的新手,无法为问题创建循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71565095/

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