使用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
您是否认为可以使用重塑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 = "")
答案 0 :(得分:3)
您可以使用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
答案 1 :(得分: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
您可以重命名PARC
和POP
列;这些名称来自原始列名称。