如何在数据框中的一行之后取每行70并将该行添加到一行?

时间:2013-08-11 15:56:15

标签: r numbers dataframe

如果我的数据框中有一行x,那么我想在x之后取行(x + 70)或70并将该行添加到行x。

以下是一个例子:

     a b           a b a b
   x 2 3         x 2 3 4 5
   . . .
   . . .
x+70 4 5

有没有办法为任何数字(不仅仅是70)执行此操作?

编辑:我忘记提及这一点,但我想对所有行执行此操作,以便总共有70行。

4 个答案:

答案 0 :(得分:1)

一个间隙为3而不是70的小例子,假设您对最后gap行不感兴趣,无论如何都会在'new'a和b列中给出NA。< / p>

dd <- data.frame(a = sample(1:10, 10), b = sample(1:10, 10))
dd
gap <- 3
cbind(head(dd, -gap), c(tail(dd, -gap)))

答案 1 :(得分:0)

如果数据框的名称为dfx为数字且行x+70存在,则以下结果为单行数据框:

cbind(df[x, ], df[x+70, ])

如果必须经常或自动执行此操作,您可能希望将其包装在函数中以检查行x+70是否存在。

答案 2 :(得分:0)

不确定这是否是您所追求的,但如果您想要每70行,您可以使用seq

df[seq(from=1, to=nrow(df), by=70), ]

其中df是数据框。您可以使用任何值from=1而不是x,如果您想要一个比70更短的周期,则可以改变by参数。

答案 3 :(得分:0)

这是函数myrow,允许您输入数据框,行号和增量。

myrow<-function(df,x,y){
#df is my dataframe
#x is your row number
#y is the increment
#mydata is the desired dataframe

if (x>=nrow(df)){
cat("The value of x=",x, "is greater than number of rows of your dataframe=",nrow(df), "\n")
}else if ((x+y)>=nrow(df)){
cat("There is no row x+y=",x+y, "for this value of y=",y, "in your dataframe", "\n")
}else{
mydata<-cbind(df[x, ], df[x+y, ])
return(mydata)
}
}

#Testing the `myrow` function using the `mtcars` data in R

> myrow(mtcars,10,30)
There is no row x+y= 40 for this value of y= 30 in your dataframe 
> myrow(mtcars,34,10)
The value of x= 34 is greater than number of rows of your dataframe= 32 
> myrow(mtcars,2,10)
              mpg cyl disp  hp drat    wt  qsec vs am gear carb  mpg cyl  disp  hp drat   wt qsec vs am gear
Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4 16.4   8 275.8 180 3.07 4.07 17.4  0  0    3
              carb
Mazda RX4 Wag    3