2013-04-15 25 views
-10

我会很感激的帮助与R.重新排序数据框 其中一列是这样[R重排一列分三路

a 
b 
c 
d 
e 
f 
g 
h 
i 
j 
k 
l 

,我想使它

a b c 
d e f 
g h i 
j k l 

如何在R或c-shell中执行此操作?

+2

你是什么意思reorder-你是否试图将12个项目的一列变成三个四个项目的列?如果是这样,它怎么能适合相同的数据框? –

+0

我刚刚意识到我的问题更加复杂,因为我希望这个专栏能够完成我所说的内容,但不要修改其他专栏。所以基本上重排序后的第一行是abc,第二行是0 0 0,第三行是0 0 0,第四行是def,等等...... – user2283859

+0

请举个例子输入数据(最好使用'dput')和你想要的输出的例子。 –

回答

5
matrix(your_vector, ncol=3, byrow=TRUE) 
0

这将完成你的第二个版本:

orig <- matrix(letters[1:12], ncol=1) 

new[ seq(1, 1+ 4*3, by=4), ] <- matrix(orig, ncol=3, byrow=TRUE) 

> new 
     [,1] [,2] [,3] 
[1,] "a" "b" "c" 
[2,] "0" "0" "0" 
[3,] "0" "0" "0" 
[4,] "0" "0" "0" 
[5,] "d" "e" "f" 
[6,] "0" "0" "0" 
[7,] "0" "0" "0" 
[8,] "0" "0" "0" 
[9,] "g" "h" "i" 
[10,] "0" "0" "0" 
[11,] "0" "0" "0" 
[12,] "0" "0" "0" 
[13,] "j" "k" "l" 

关键是要构造一个非连续的行序列,其将接受字符值的4×3矩阵。由于这是一个矩阵,它会用引号打印,但矩阵中的值实际上并没有真正的引号;它们只是字符分类的元素而不是数字。

3

merge可以在这里协助。

请考虑以下初始data.frame。两列,一个字母“A”到“L”,接下来的数字1到12。

mydf <- data.frame(A = letters[1:12], B = 1:12) 

你已经看到,一个向量转换为多列矩阵使用matrix(your_vector...)完成。如果您查看merge的代码,则会看到如果您尝试合并data.framematrix,则矩阵将使用as.data.frame转换为数据帧,从而导致变量名称如“V1”,“V2”,“等等。

我们可以利用所有的琐事的构建merge如下命令:

merge(mydf, matrix(mydf$A, ncol = 3, byrow=TRUE), 
     by.x = "A", by.y = "V1", all.x = TRUE) 
# A B V2 V3 
# 1 a 1 b c 
# 2 b 2 <NA> <NA> 
# 3 c 3 <NA> <NA> 
# 4 d 4 e f 
# 5 e 5 <NA> <NA> 
# 6 f 6 <NA> <NA> 
# 7 g 7 h i 
# 8 h 8 <NA> <NA> 
# 9 i 9 <NA> <NA> 
# 10 j 10 k l 
# 11 k 11 <NA> <NA> 
# 12 l 12 <NA> <NA> 

填充用零是没有意义的,因为在data.frame每列只能有一种类型。因此,您的零将被转换为字符或因素。

当然,重新命名和重新排序列是一个简单的练习,我将留给读者。

+0

谢谢!有效! – user2283859

+0

@ user2283859,如果这解决了您的问题,请*考虑* [接受它](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。谢谢! – A5C1D2H2I1M1N2O1R2T1