Порядок перестановки для пары в R - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть столбец с 10 случайными числами, из которого я хочу создать новый столбец, который поменял местами для каждой пары, см. Пример, как я имею в виду. Как бы вы это сделали?

column    newcolumn
   1         5
   5         1
   7         6
   6         7
   25        67
   67        25
   -10       2
   2         -10
   -50       36
   36        -50

Ответы [ 5 ]

0 голосов
/ 28 апреля 2018

Вот такой компактный способ:

a$new_col <- c(matrix(a$column,2)[2:1,])

#    column new_col
# 1       1       5
# 2       5       1
# 3       7       6
# 4       6       7
# 5      25      67
# 6      67      25
# 7     -10       2
# 8       2     -10
# 9      50      36
# 10     36      50

Идея состоит в том, чтобы записать в матрицу из 2 строк, переключить строки и развернуть обратно в векторе.

0 голосов
/ 26 апреля 2018

Используя тот факт, что R будет копировать меньшие векторы при добавлении их к большим векторам, вы можете:

a <- data.frame(column=c(1,5,7,6,25,67,-10,2,50,36))
a$newColumn <- a$column[seq(nrow(a)) + c(1, -1)]
0 голосов
/ 26 апреля 2018

Вот базовая однострочная буква R: мы можем привести column как матрицу 2 x nrow(df)/2, поменять строки и преобразовать как вектор.

df$newcolumn <- c(matrix(df$column, ncol = nrow(df) / 2)[c(2,1), ]);
#   column newcolumn
#1       1         5
#2       5         1
#3       7         6
#4       6         7
#5      25        67
#6      67        25
#7     -10         2
#8       2       -10
#9     -50        36
#10     36       -50

Пример данных

df <- read.table(text =
    "column
   1  
   5  
   7  
   6  
   25
   67
   -10
   2
   -50
   36", header = T)
0 голосов
/ 26 апреля 2018

Другой вариант будет использовать ave и rev

transform(df, newCol = ave(x = df$column, rep(1:5, each = 2), FUN = rev))
#   column newCol
#1       1      5
#2       5      1
#3       7      6
#4       6      7
#5      25     67
#6      67     25
#7     -10      2
#8       2    -10
#9     -50     36
#10     36    -50

Деталь rep(1:5, each = 2) создает группирующую переменную ("пары"), для каждой из которых мы rev отбираем элементы.

0 голосов
/ 26 апреля 2018

Как то так.

a <- data.frame(column=c(1,5,7,6,25,67,-10,2,50,36))
a$newColumn <- 0
a[seq(1,nrow(a),by=2),"newColumn"]<-a[seq(2,nrow(a),by=2),"column"]
a[seq(2,nrow(a),by=2),"newColumn"]<-a[seq(1,nrow(a),by=2),"column"]

# results
   column newColumn
1       1         5
2       5         1
3       7         6
4       6         7
5      25        67
6      67        25
7     -10         2
8       2       -10
9      50        36
10     36        50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...