如何将数据帧的整行移动一个位置

时间:2015-01-12 10:53:41

标签: r

我有一个数据框,我想将整行向上移动1个位置。数据框如下所示。

Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
  5.1         3.5          1.4         0.2         setosa
  4.9         3.0          1.4         0.2         setosa
  4.7         3.2          1.3         0.2         setosa
  4.6         3.1          1.5         0.2         setosa
  5.0         3.6          1.4         0.2         setosa
  5.4         3.9          1.7         0.4         setosa

更新后的版本应该是这样的。

Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
   5.1         3.5          1.4         0.2        setosa
   4.9         3.0          1.4         0.2        setosa
   4.7         3.2          1.3         0.2        setosa
   4.6         3.1          1.5         0.2        setosa
   5.0         3.6          1.4         0.2        setosa

   5.4         3.9          1.7         0.4        setosa

我试过这个:

a[j,] <- a[j-1,]

但似乎没有用。如何正确地做到这一点。

编辑:它看起来像这样

Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
       5.1         3.5          1.4         0.2        setosa
       4.9         3.0          1.4         0.2        setosa
       4.7         3.2          1.3         0.2        setosa
       4.6         3.1          1.5         0.2        setosa
       5.0         3.6          1.4         0.2        setosa
       AAA         bbb          ccc         ddd        dem   ##### new row 
       5.4         3.9          1.7         0.4        setosa

3 个答案:

答案 0 :(得分:1)

以下是data.table的选项(假设您有6&#34;行&#34;数据集)

library(data.table)
setDT(df)[df[,.I[1:(.N+1)] ,by=(seq_len(nrow(df))-1)%/%5+1]$V1][!.N]
#     Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1:          5.1         3.5          1.4         0.2  setosa
#2:          4.9         3.0          1.4         0.2  setosa
#3:          4.7         3.2          1.3         0.2  setosa
#4:          4.6         3.1          1.5         0.2  setosa
#5:          5.0         3.6          1.4         0.2  setosa
#6:           NA          NA           NA          NA      NA
#7:          5.4         3.9          1.7         0.4  setosa

更新

使用base R(假设没有&#34;因素&#34;列)

indx <- nrow(df) 
df[c(1:(indx - 1),(indx + 1):indx), ] #credit to @David Arenburg
df1[indx,] <- c('AAA', 'bbb', 'ccc', 'ddd', 'dem')
row.names(df1) <- NULL
df1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1           5.1         3.5          1.4         0.2  setosa
#2           4.9           3          1.4         0.2  setosa
#3           4.7         3.2          1.3         0.2  setosa
#4           4.6         3.1          1.5         0.2  setosa
#5             5         3.6          1.4         0.2  setosa
#6          AAA         bbb          ccc         ddd     dem
#7           5.4         3.9          1.7         0.4  setosa

注意:上面的步骤应该转换来自&#34; numeric&#34;的所有列。到&#34;字符&#34;

答案 1 :(得分:1)

试试这个

data <- iris
data$Species <- as.character(data$Species)
df = data
up_row_num = 3
up_row_val = c("AAA","bbb","ccc","ddd","dem" )
head(data.frame(rbind(df[1:up_row,],up_row_val , df[(up_row+1):nrow(df),]),
                row.names =1:(nrow(df)+1)))

 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9           3          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          AAA         bbb          ccc         ddd     dem
5          4.6         3.1          1.5         0.2  setosa
6            5         3.6          1.4         0.2  setosa

答案 2 :(得分:0)

喜欢这个吗?

df = head(iris)
index = 5
newDF = rbind(df[1:index,], NA, df[(index+1):nrow(df),])

#>newDF
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1           5.1         3.5          1.4         0.2  setosa
#2           4.9         3.0          1.4         0.2  setosa
#3           4.7         3.2          1.3         0.2  setosa
#4           4.6         3.1          1.5         0.2  setosa
#5           5.0         3.6          1.4         0.2  setosa
#6            NA          NA           NA          NA    <NA>
#61          5.4         3.9          1.7         0.4  setosa

根据您的编辑,您可以继续:

df$Species=as.character(df$Species)
newDF = rbind(df[1:index,], c('AAA', 'bbb', 'ccc', 'ddd', 'dem'), df[(index+1):nrow(df),])

但这不是一个好方法,因为你混合了第四个第一列的数字值和字符,将数字值隐含地转换为字符。