r“slot”两列合二为一(如拉链)

时间:2013-04-23 01:26:04

标签: r merge

给定长度 N 的两列(可能来自数据帧),如何生成长度为 2N 的列,其中包含来自第一列的奇数条目来自第二列的偶数条目?

假设我有以下数据框

df.1 <- data.frame(X = LETTERS[1:10], Y = 2*(1:10)-1, Z = 2*(1:10))

如何生成此数据框df.2

i <- 1
j <- 0
XX <- NA
while (i <= 10){
XX[i+j] <- LETTERS[i]
XX[i+j+1]<- LETTERS[i]
i <- i+1
j <- i-1
}

df.2 <- data.frame(X.X = XX, Y.Z = c(1:20))

6 个答案:

答案 0 :(得分:4)

ggplot2有一个未导出的函数interleave可以执行此操作。

虽然未导出确实有一个帮助页面(?ggplot2:::interleave

with(df.1, ggplot2:::interleave(Y,Z))
## [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

答案 1 :(得分:2)

如果我理解你正确,你想创建一个新的向量,它是数据帧中向量X,Y和Z长度的两倍,然后希望X的所有元素占据这个新向量的奇数索引,并且所有Y的元素是偶数指数。如果是这样,那么下面的代码应该可以解决问题:

foo<-vector(length=2*nrow(df.1), mode='character')

foo[seq(from = 1, to = 2*length(df.1$X), by=2)]<-as.character(df.1$X)
foo[seq(from = 2, to = 2*length(df.1$X), by=2)]<-df.1$Y

注意,我首先创建一个长度为20的空向量foo,然后用df.1 $ X和df.1​​ $ Y的元素填充它。

干杯,

丹尼

答案 2 :(得分:1)

您可以使用melt中的reshape2

library(reshape2)
foo <- melt(df.1, id.vars='X')

> foo
   X variable value
1  A        Y     1
2  B        Y     3
3  C        Y     5
4  D        Y     7
5  E        Y     9
6  F        Y    11
7  G        Y    13
8  H        Y    15
9  I        Y    17
10 J        Y    19
11 A        Z     2
12 B        Z     4
13 C        Z     6
14 D        Z     8
15 E        Z    10
16 F        Z    12
17 G        Z    14
18 H        Z    16
19 I        Z    18
20 J        Z    20

然后您可以排序并选择所需的列:

foo[order(foo$X), c('X', 'value')]

答案 3 :(得分:1)

使用基础R的另一种解决方案。

首先使用向量[1,1,2,2 ... 10,10]索引data.frame的字符向量,并将其存储为X.X。接下来,rbind data.frame向量Y&amp; Z有效地“压缩”它们并存储在Y.X

> res <- data.frame(
+   X.X = df.1$X[c(rbind(1:10, 1:10))],
+   Y.Z = c(rbind(df.1$Y, df.1$Z))
+ )
> head(res)
  X.X Y.Z
1   A   1
2   A   2
3   B   3
4   B   4
5   C   5
6   C   6

答案 4 :(得分:1)

在基地R中一个两个班轮:

test <- data.frame(X.X=df.1$X,Y.Z=unlist(df.1[c("Y","Z")]))
test[order(test$X.X),]

答案 5 :(得分:0)

假设您想要在第一段中提出要求,而您发布的其余内容就是您尝试解决它。​​

a=df.1[df.1$Y%%2>0,1:2]
b=df.1[df.1$Z%%2==0,c(1,3)]
names(a)=c("X.X","Y.Z")
names(b)=names(a)
df.2=rbind(a, b)

如果你想按照例子中的X.X对它们进行分组,你可以这样做:

library(plyr)
arrange(df.2, X.X)