我有一个包含10个随机数的列,我希望创建一个新列,为每对配对切换位置,请参阅我的意思示例。你会怎么做?
column newcolumn
1 5
5 1
7 6
6 7
25 67
67 25
-10 2
2 -10
-50 36
36 -50
答案 0 :(得分:2)
利用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)]
答案 1 :(得分:1)
像这样的东西。
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
答案 2 :(得分:1)
这是一个基础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)
答案 3 :(得分:1)
另一种选择是使用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
元素创建一个分组变量(“pair”)。
答案 4 :(得分:0)
这是一种紧凑的方式:
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行矩阵,切换行,并在向量中展开。