如果我的数据框中有行 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 行。
一个间隙为 3 而不是 70 的小示例,假设您对最后一行不感兴趣,这些行无论如何gap
都会在“新”a 和 b 列中给出。NA
dd <- data.frame(a = sample(1:10, 10), b = sample(1:10, 10))
dd
gap <- 3
cbind(head(dd, -gap), c(tail(dd, -gap)))
不确定这是否是你所追求的,但如果你想要每 70 行,你可以使用seq
df[seq(from=1, to=nrow(df), by=70), ]
数据框在哪里df
。代替from=1
,您可以使用任何值x
,如果您想要比 70 更短的周期,您可以改变by
参数。
df
如果数据框已命名且x
为数字且行x+70
存在,则以下结果为单行数据框:
cbind(df[x, ], df[x+70, ])
如果您必须经常或自动执行此操作,您可能希望将其包装在一个函数中以检查行是否x+70
存在。
这是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