R中的多个转置

时间:2016-06-10 23:27:10

标签: r

我有一个像这样的data.frame:

country a
country b
country c
country d
123
567
789
101
asd
dfa
dgf
fgh

我想转换成这个:

country a      123      asd
country b      567      dfa
country c      789      dgf
country d      101      fgh

Data.frame包含很多行,所以我不能按照rownames进行子集化。 t函数转换如下:

country a countryb countryc countryd 123 567 789 101 asd dfa gf fgh 

所以,t对我来说没用。

2 个答案:

答案 0 :(得分:1)

分割此数据框的一种方法是使用矩阵。 我假设你知道最后的列数(ncols)。

# data frame example
df = data.frame(x = c("country a","country b","country c","country d",
                         "123","567","789","101","asd","dfa","dgf","fgh"),stringsAsFactors = F)

# ncols: Known number of columns
ncols = 3  

df = data.frame(matrix(df$x, dim(df)[1]/ncols, ncols), stringsAsFactors = F)

结果:

> df
         X1  X2  X3
1 country a 123 asd
2 country b 567 dfa
3 country c 789 dgf
4 country d 101 fgh

如果使用此方法,请记住原始数据框的行数应为列数的倍数。如果没有,您将收到警告,并且将使用开头的原始df填充缺失的数据

答案 1 :(得分:-1)

一个解决方案就是这个,假设上面显示的模式是它的方式......(有人可能有比我更好的正则表达式匹配。)

as.data.frame(cbind(df$V1[grep('country \\S+', df$V1)],
                    as.integer(df$V1[grep('\\d+', df$V1)]),
                    df$V1[-grep('country \\S+|\\d+', df$V1)]))

输出如下:

         V1  V2  V3
1 country a 123 asd
2 country b 567 dfa
3 country c 789 dgf
4 country d 101 fgh