给定长度 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))
答案 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)