【问题标题】:Re-use a colsplit regex cutting column with meld and reshape package重新使用带有融合和重塑包的 colsplit 正则表达式切割列
【发布时间】:2012-03-06 16:55:49
【问题描述】:

我在使用 reshape 转换经典输入数据时遇到问题

我的输入数据:

   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

你认为有可能用 reshape 1 或 2 和 colsplit 函数在一行中做到这一点吗?

我的 id 等于“Ville”+“Date”,所以我认为很难先用 colsplit 剪切,然后再用 meld 重新使用结果 id 列:/

你知道答案吗?

更新 1:

我给这个问题增加了一些难度,想象一下现在我们有数千列,并且列是混合的。我尝试使用 grep 和 reshape,但此时没有结果..(请参阅 @kohske 上的 cmets 很好的答案)

更新 2:

@kohske 通过添加此代码解决问题:

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

【问题讨论】:

  • 你在专栏里有很多年,还是只有几年?
  • 很多,大数据的批量转换,这里只是一个例子:)

标签: regex r dataframe reshape factors


【解决方案1】:

你可以使用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

【讨论】:

  • 谢谢,它工作正常,如果我想用 grep 概括?我尝试使用这条线,但我对 POP1999 有问题:cn &lt;- list(grep("*[0-9]",names(df),value=TRUE) 之后是reshape(df, varying = cn, direction = "long", sep = "")
  • 您可能需要的是cn &lt;- grep("*[0-9]",names(df),value=TRUE)。删除list
  • 很好,它有效!谢谢 :) 那么,您认为还有另一种解决方案吗?
【解决方案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 列;这些名称来自原始列名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2013-03-26
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多