簡體   English   中英

將 DF 中一列中的數字(int)拆分為 4 個新列 R

[英]splitting a number(int) within a column in DF into 4 new columns R

以下是我通過導入每周摘要.csv 創建的 DF 中的一列的輸出。 這些是唯一的代碼,每個代碼的長度只能是 4 個數字,即 8400、9070 等。當生成摘要文檔時,所有代碼都聚集在一起,沒有逗號或縮進。 像下面這樣:

1 84709070
2 75508470
3 8400
3 750084009100

有沒有辦法可以將上面的內容轉換為 4 個新行,將數字從第一個 int 開始分成 4 個位置,即輸出第四行如下所示:

tariff1, tariff2, tariff3, tariff4
7500     8400     9100     none

我設法在 excel 中創建了一個令人憎惡的東西,但它在最好的時候幾乎不起作用,我更喜歡使用 R 來處理所有事情,我們每周收到大約 3 萬個這樣的條目,這將真正簡化流程!

您可以使用tidyr::separate提及要在sep拆分的位置。

tidyr::separate(df, V2, paste0('col', 1:4), sep = seq(4, 12, 4), convert = TRUE)

#  V1 col1 col2 col3 col4
#1  1 8470 9070   NA   NA
#2  2 7550 8470   NA   NA
#3  3 8400   NA   NA   NA
#4  3 7500 8400 9100   NA

seq生成位置序列。

seq(4, 12, 4)
#[1]  4  8 12

數據

df <- structure(list(V1 = c(1L, 2L, 3L, 3L), V2 = c(84709070, 75508470, 
8400, 750084009100)), class = "data.frame", row.names = c(NA, -4L))

這是一個基本的 R 選項,它定義了一個函數f來分割數字

f <- function(x) t(`length<-`(as.numeric(sapply(seq(1,nchar(x),by = 4), function(k) substr(x,k,k+3))),4))
dfout <- cbind(df,data.frame(Vectorize(f)(df$V2)))

以至於

  V1           V2   X1   X2   X3   X4
1  1     84709070 8470 7550 8400 7500
2  2     75508470 9070 8470   NA 8400
3  3         8400   NA   NA   NA 9100
4  3 750084009100   NA   NA   NA   NA

數據

> dput(df)
structure(list(V1 = c(1L, 2L, 3L, 3L), V2 = c(84709070, 75508470, 
8400, 750084009100)), class = "data.frame", row.names = c(NA,
-4L))

base R使用strsplit的選項

lst1 <- strsplit(as.character(df$V2), "(?<=....)", perl = TRUE)
df[paste0('col', 1:4)] <- do.call(rbind, lapply(lst1, 
              `length<-`, max(lengths(lst1))+1))
df <- type.convert(df, as.is = TRUE)

-輸出

df
#  V1           V2 col1 col2 col3 col4
#1  1     84709070 8470 9070   NA   NA
#2  2     75508470 7550 8470   NA   NA
#  3         8400 8400   NA   NA   NA
#4  3 750084009100 7500 8400 9100   NA

或者使用來自base R read.fwf

df[paste0('col', 1:4)] <-  read.fwf(file = textConnection(as.character(df$V2)),
              widths = c(4, 4, 4, 4))

數據

df <- structure(list(V1 = c(1L, 2L, 3L, 3L), V2 = c(84709070, 75508470, 
8400, 750084009100)), class = "data.frame", row.names = c(NA,
-4L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM