使用R来读取和重新组织Excel数据

时间:2014-07-21 19:48:17

标签: r excel

我有一个excel数据集(保存为csv),它有3列和数千行数据。我需要重新组织这些数据,以便其中一些以某些增量重复。为了说明,我说我有三列标题的以下数据:

  

X Y Z

     

1 5 2

     

2 18 23

     

3 9 25

     

4 10 32

     

5 11 34

     

6 23 24

     

7 89 54

     

8 25 12

     

9 24 10

     

10 3 11

(仅供参考,此数据仅用于说明目的) 我的目标是通过复制一些行(比如一次4行)重新组织这些数据,然后一个接一个地插入它们,从而产生交错的效果。因此,如果我们对上面的示例数据执行此操作,则不会复制第1-4行,而是先复制第2-5行,然后在第4行之后插入。这将对原始行3-6重复,然后是原始行4-7等,直到一个人不能再复制/插入4行的整个增量(在这种情况下,当我们按行7-10时)实际上:

  

X Y Z

     

1 5 2

     

2 18 23

     

3 9 25

     

4 10 32

     

2 18 23

     

3 9 25

     

4 10 32

     

5 11 34

     

3 9 25

     

4 10 32

     

5 11 34

     

6 23 24

     

4 10 32

     

5 11 34

     

6 23 24

     

7 89 54

     

5 11 34

     

6 23 24

     

7 89 54

     

8 25 12

     

6 23 24

     

7 89 54

     

8 25 12

     

9 24 10

     

7 89 54

     

8 25 12

     

9 24 10

     

10 3 11

(仅供参考:我使用粗体斜体仅用于强调)

我不喜欢在R中这样做 - 如果可以在Excel(或任何其他程序)中完成,我会很高兴听到如何。考虑到这些excel文件的大小,我手动复制/插入是不可行的。我猜可以使用某种for循环吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

这应该适用于您的示例(假设您的数据位于名为my.data的矩阵或数据框中):

my.data[ as.vector( mapply(1:7, 4:10, FUN='seq') ), ]

然后,您只需更改7和10即可代表您的数据(可能是nrow(my.data)-3nrow(my.data))。

答案 1 :(得分:0)

看起来我能够找到一个有效的解决方案。这是代码:

## Import Data from CSV ##

require(xlsx)
require(rJava)


ogdata <- read.table("dataupload.csv", header = TRUE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "")
str(ogdata)




##Add x, the cut off for ogdata ##

x<-nrow(ogdata)




## Manipulate ogdata to add day and hour columns ##


require(lubridate)
require(methods)


dates<-as.POSIXlt(ogdata$Time)


ogdata$hour<-hour(dates)
ogdata$day<-mday(ogdata$Time)




##############  FOR LOOPS!!! ################

  # counts
a<-1
b<-720

  #anchor 

anchorFrame<-data.frame((ogdata[a:b, "hour"]), 
                        (ogdata[a:b, "Value"]))

  #the for loop should be indexed in a sequenced where it goes from 0 to x-30, 
  # moving up by 24 (i.e. one day at a time)   
a=a+24
b=b+24
for (i in seq(from=25, to=(x-30), by=24))  {
  tframes<-data.frame((ogdata[a:b, "hour"]), 
                      (ogdata[a:b, "Value"]))
  anchorFrame<-rbind(anchorFrame, tframes)
  a=a+24
  b=b+24
}

##Create new counter for anchorFrame

y<-nrow(anchorFrame)
lineNumber<-c(seq(1:y))

## Create a Day 'For loop'

daylinenumber<-c(seq(1:(30*24)))
Day<-data.frame(c(ceiling(daylinenumber/24)))

for (i in seq(from=721, to=(y), by=720)) {
  nextmonthofdays<-data.frame(c(ceiling(daylinenumber/24)))
  Day<-rbind(Day, nextmonthofdays)
}

## Create "t," or the variable known as "Time Frame"

anchorFrame$t<-c(ceiling(lineNumber/720))

## Bind columns in the correct order

FinalSet<-cbind(Day, anchorFrame)

## Give column header the correct names
colnames(FinalSet)<-c("Day", "Hour", "Value", "time")

#### Export data as a csv #####