3

给定长度相等的两列(可能来自数据帧)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))
4

6 回答 6

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
于 2013-04-23T01:56:38.623 回答
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 的元素填充它。

干杯,

丹尼

于 2013-04-23T02:26:51.497 回答
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')]
于 2013-04-23T01:37:55.453 回答
1

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

首先使用向量索引 data.frame 的字符向量[1,1,2,2 ... 10,10]并存储为X.X. 接下来,rbinddata.frame 向量YZ有效地“压缩”它们并存储在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
于 2013-04-23T03:37:26.913 回答
1

底座 R 中的对二衬管:

test <- data.frame(X.X=df.1$X,Y.Z=unlist(df.1[c("Y","Z")]))
test[order(test$X.X),]
于 2013-04-23T04:29:47.567 回答
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)

如果您想按照示例中所示按 XX 对它们进行分组,您可以执行以下操作:

library(plyr)
arrange(df.2, X.X)
于 2013-04-23T02:06:44.303 回答