簡體   English   中英

重復使用帶有融合和重塑包裝的分色正則表達式切割柱

[英]Re-use a colsplit regex cutting column with meld and reshape package

我無法通過重塑來轉換經典輸入數據

我的輸入數據:

   df <- read.table(textConnection(" Ville POP1999 POP2010 PARC1999 PARC2010
    1 Paris 1800000 2200000 150 253
    2 Itxassou 1000 1800 0 NA
    "))

結果在此data.frame中:

     Ville   POP1999 POP2010 PARC1999 PARC2010
1    Paris 1800000 2200000    150      253
2 Itxassou    1000    1800      0       NA

我有這種類型的輸入,並且我想使用帶有正則表達式的colsplit(reshape2包)來像這樣剪切我的數據框:

     Ville    Date    Population Parc 
1    Paris    1999    1800000    150
2    Paris    2010    2200000    253
3    Itxassou 1999    1000       0
4    Itxassou 2010    1800       NA

您是否認為可以通過重塑1或2並使用colsplit函數在一行中完成此操作?

我的id等於“ Ville” +“ Date”,所以我認為很難先用colsplit剪切,然后再將結果id colum與meld一起使用:/

你有答案的想法嗎?

更新1:

我給這個問題增加了一些難度,想象一下現在我們有成千上萬的列,並且列是混合的。 我嘗試使用grep和reshape,但目前沒有任何結果。.(請參閱有關@kohske很棒的答案的評論)

更新2:

@kohske通過添加以下代碼解決了問題:

cn <- grep("*[0-9]",names(df),value="TRUE")
reshape(df, varying =  cn, direction = "long", sep = "")

您可以使用stats::reshape

> reshape(df, 2:5, direction = "long", sep = "")
          Ville time     POP PARC id
1.1999    Paris 1999 1800000  150  1
2.1999 Itxassou 1999    1000    0  2
1.2010    Paris 2010 2200000  253  1
2.2010 Itxassou 2010    1800   NA  2

這是一個純reshape2解決方案:

library("reshape2")
library("stringr")

df2 <- melt(df, id.var=c("Ville"))
df2 <- cbind(df2, 
             colsplit(df2$variable, pattern=perl("(?=\\d)"), c("var", "Date")))
dcast(df2, Ville + Date ~ var)

棘手的部分是(Perl)正則表達式,它是對數字的超前查找。 variable (以前是列標題)在第一個數字前分割。 結果是

     Ville Date PARC     POP
1 Itxassou 1999    0    1000
2 Itxassou 2010   NA    1800
3    Paris 1999  150 1800000
4    Paris 2010  253 2200000

您可以重命名PARCPOP列; 這些名稱來自原始列名稱。

暫無
暫無

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

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