我有以下資訊:
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 個這樣的保單編號和金額資訊。
非常感謝您的幫助。
uj5u.com熱心網友回復:
使用回圈的可能替代方法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))
uj5u.com熱心網友回復:
旋轉更長的時間,然后洗掉所有 999999 值。
library(dplyr)
df %>%
pivot_longer(cols = starts_with("Info"), names_to = "Info") %>%
filter(!Info == 999999)
uj5u.com熱心網友回復:
在某些情況下,我們需要將資料從寬格式旋轉到長格式。我的一些代碼中有類似的問題,但相反。這是我發布的問題。這也提供了可用于解決此問題的其他選項。
R-如何將多個案例(行)放在一行中
我會使用重塑。這是 r 檔案的鏈接。
https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/reshape
這是資料。
policyno <- c (1001, 1002, 1003)
amount <- c (100, 200, 300)
info1 <- c (500001, 600001, 700001)
info2 <- c (500002, 600002, 700002)
info3 <- c (500003, 999999, 700003)
info4 <- c (999999, 999999, 700004)
info5 <- c (999999, 999999, 700005)
data <- data.frame (policyno, amount, info1, info2, info3, info4, info5)
data
我們需要輸入一些東西才能使 reshape 起作用。我們需要資料框的名稱(data),id變數(policyno)。我們還需要我們想要創建的新變數的名稱 (info) 和組成這個新變數的變數串列 (info1, info2, info3, info4, info5)。為了生成這個變數串列,有幾種方法可以做到這一點。我看過我們列出行號的帖子。如果我們有一個非常小的資料集并且變數(以及它們的行號保持不變),那么這種方法很好。如果您正在使用一個非常大的資料集,其中行號可能會根據您對資料進行子集化的方式而改變,那么我們可以讓 R 為我們識別行號。which 和 calnames 可用于此目的。
data2 <- reshape (data,
idvar = "policyno",
v.names = c ("info"),
varying = list (c (which(colnames(data) == "info1"),
which (colnames(data) == "info2"),
which(colnames(data) == "info3"),
which(colnames(data) == "info4"),
which(colnames(data) == "info5")
)
),
direction = "long")
data2
這會旋轉資料,但不會洗掉 999999 個案例。要洗掉 999999,我們可以使用子集。正如我所注意的,這種重塑創建了一個標記為 time 的變數,我們可以使用 select 將其洗掉。
data3 <- subset (data2,
select = -c (time),
info != 999999)
data3
同樣,這只是可以用來解決問題的一種方法。Stackoverflow 有很多關于 reshape 和 transpose 的帖子非常有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446278.html
