如何在R代码的两级标题上旋转数据帧 [英] How to pivot a dataframe on a two level header in R code
本文介绍了如何在R代码的两级标题上旋转数据帧的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我仍然是R的新手,这几天来我一直在为这个问题而苦苦挣扎。我找到了一些解决方案,但我正在寻找简短的代码,我宁愿避免循环,但到目前为止,我只能想到这些。 我的数据如下:
我希望它的外观如下:
Country Year ATM POS
France 2015 1 10
France 2014 5 2
France 2013 12 4
France 2012 2 12
我没有找到解决此问题的捷径,所以我将其分解为几个步骤:我禁用了标题,尝试从第1行创建向量,我想我应该先对年份做更长时间的透视,但我得到了一个错误:
ATM <- pivot_longer(data = dat, cols = dat[,2:6],names_to = "Year",values_to = headervector)
这还需要POS部件的循环。 那么,除了解决这个问题之外,还有没有更好的不需要循环的方法呢?
非常感谢!
推荐答案
您可以将此解决方案用于任意数量的设备和年份,而以前仅处理ATM
和POS
。这是使用您的第一个数据屏幕(只需加载您的Excel文件)完成的:
library(xlsx)
library(zoo)
library(reshape2)
library(dplyr)
library(tidyr)
#Data
dat <- structure(list(NA. = structure(1:2, .Label = c("Country", "France"
), class = "factor"), ATM = c(2015, 12), NA..1 = c(2014, 3),
NA..2 = c(2013, 4), NA..3 = c(2012, 6), NA..4 = c(2011, 7
), NA..5 = c(2010, 8), POS = c(2015, 9), NA..6 = c(2014,
9), NA..7 = c(2013, 12), NA..8 = c(2012, 11), NA..9 = c(2011,
56), NA..10 = c(2010, 78)), class = "data.frame", row.names = c(NA,
-2L))
#Process names
names(dat)[1]<-'Country'
vecnames <- names(dat)[-1]
vecnames[which(grepl('NA',vecnames))]<-NA
vecnames <- na.locf(vecnames)
#Include year
vecnames2 <- dat[1,-1]
#Join
vecnames3 <- paste0(vecnames,'_',vecnames2)
#Assign names
names(dat)[-1]<-vecnames3
#Remove first row
dat <- dat[-1,]
#Melt data
melt.data <- melt(dat,id.vars = 'Country')
melt.data$variable<-as.character(melt.data$variable)
#Create columns
melt.data %>%
separate(variable, c("Device", "Year"), "_") -> melt.data
#Output
DataG <- reshape(melt.data, idvar=c('Country','Year'), timevar='Device', direction="wide")
输出:
Country Year value.ATM value.POS
1 France 2015 12 9
2 France 2014 3 9
3 France 2013 4 12
4 France 2012 6 11
5 France 2011 7 56
6 France 2010 8 78
这篇关于如何在R代码的两级标题上旋转数据帧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文