2

我有一个看起来像这样的数据框:

TRUE    x_value1    x_value2    y_value1    y_value2    x_id    y_id
0           1            4        11             14      1       7
1           2            5        12             15      2       8
0           3            6        13             16      3       9

我想向这个数据框添加行并切换 x 和 y,以便在第 4 行 x_value1=y_value1 和 x_id=y_id 和 y_value1=x_value1...等。

像这样:

 TRUE   x_value1    x_value2    y_value1    y_value2    x_id    y_id
    0           1            4        11             14      1       7
    1           2            5        12             15      2       8
    0           3            6        13             16      3       9
    0           11           14       1              4       7       1
    1           12           15       2              5       8       2
    0           13           16       3              6       9       3

我可以用 for 循环做到这一点,但这需要很长时间

例如

for (i in 1:3)
{ dataframe[i+3,2]<-dataframe[i,4] //for i=1, finds 4th row, column "x_value1" and switches it with first row, column "y_value1"
  dataframe[i+3,3]<-dataframe[i,5]
...etc.
}

我拥有的示例数据框(上面的第一个表):

structure(list(TRUE. = c(0L, 1L, 0L), x_value1 = 1:3, x_value2 = 4:6, 
    y_value1 = 11:13, y_value2 = 14:16, x_id = 1:3, y_id = 7:9), .Names = c("TRUE.", 
"x_value1", "x_value2", "y_value1", "y_value2", "x_id", "y_id"
), row.names = c(NA, 3L), class = "data.frame")

期望(上面的第二个表):

structure(list(TRUE. = c(0L, 1L, 0L), x_value1 = 1:3, x_value2 = 4:6, 
    y_value1 = 11:13, y_value2 = 14:16, x_id = 1:3, y_id = 7:9), .Names = c("TRUE.", 
"x_value1", "x_value2", "y_value1", "y_value2", "x_id", "y_id"
), row.names = c(NA, 3L), class = "data.frame")
4

3 回答 3

4

如果 dd 是您的原始数据框,那么您可以尝试:

dd2 <- cbind(dd[1], dd[4:5], dd[2:3],dd[7:6])

names(dd2) <- names(dd)

dd <- rbind(dd, dd2)
于 2013-06-10T17:01:36.383 回答
3

更“以编程方式”做到这一点:使用 grep 和列名的模式:

> grep("y_", names(dat))
[1] 4 5 7
> grep("x_", names(dat))
[1] 2 3 6

dat2 <- dat
# Replace all the dat2 "y_"-names with "x_"-names
colnames(dat2)[grep("y_", colnames(dat))] <- 
                    colnames(dat)[grep("x_", colnames(dat))]
# Replace alldat2  the "x_"-names with "y_"-names
colnames(dat2)[grep("x_", colnames(dat))] <- 
                     colnames(dat)[grep("y_", colnames(dat))]
colnames(dat2)
#[1] "TRUE."    "y_value1" "y_value2" "x_value1" "x_value2" "y_id"    
#[7] "x_id"    

rbind(dat,dat2)
#-----------------
  TRUE. x_value1 x_value2 y_value1 y_value2 x_id y_id
1     0        1        4       11       14    1    7
2     1        2        5       12       15    2    8
3     0        3        6       13       16    3    9
4     0       11       14        1        4    7    1
5     1       12       15        2        5    8    2
6     0       13       16        3        6    9    3
于 2013-06-10T17:10:40.337 回答
2

您可以重命名列,然后让 rbind 负责匹配顺序,而不是像其他人建议的那样重新排列数据框:

dat2 <- dat
colnames (dat2) <- colnames (dat) [c (1, 4, 5, 2, 3, 7, 6)]

dat3 <- rbind (dat, dat2)

编辑:或更以编程方式,以避免输入列索引,我一直做错

dat2 <- dat

newnames <- gsub ("(x|y)_", "\\1\\1_", colnames(dat))
newnames <- gsub ("xx_", "y_", newnames)
newnames <- gsub ("yy_", "x_", newnames)
colnames(dat2) <- newnames

dat3 <- rbind (dat, dat2)
于 2013-06-10T17:30:00.933 回答