R将数据表不同的列值转换为列名和列值作为另一列

时间:2016-01-25 14:18:22

标签: r matrix

问题1)

我有一个包含三列的R数据表(实际数据集更大但是为了更好地理解而简化)

Column_One, Column_Two, Column_Three

A, 1, 4
A, 2, 3
A, 3, 77
B, 1, 44
B, 2, 32
B, 3, 770
C, 1, 43
C, 2, 310
C, 3, 68

我想从上面创建一个新矩阵(数据表),如下所示。

A, B, C
4, 44, 43
3, 32, 310
77, 770, 68

请注意,在实际数据表中,第一列和第二列有数百个不同的值。因此,需要一个通用的解决方案。

有任何问题,请告诉我。非常感谢任何建议。

问题2)

可能有另一个级别,如第四列,第0列,它链接一些列列。在这种情况下,我们需要基于列零创建新数据表,然后将解决方案应用于每个子数据表的第一列。请以最快捷/最简单的方式提出建议。

Column_Zero, Column_One, Column_Two, Column_Three

XX,A, 1, 4
XX,A, 2, 3
XX,A, 3, 77
XX,B, 1, 44
XX,B, 2, 32
XX,B, 3, 770
XX,C, 1, 43
XX,C, 2, 310
XX,C, 3, 68       
YY,A1, 1, 4
YY,A1, 2, 3
YY,A1, 3, 77
YY,B1, 1, 44
YY,B1, 2, 32
YY,B1, 3, 770
YY,C1, 1, 43
YY,C1, 2, 310
YY,C1, 3, 68 
YY,D2, 1, 4
YY,D2, 2, 5
YY,D2, 3, 6 

---------等等-----

然后我们需要创建,

------数据表一------

A, B, C
4, 44, 43
3, 32, 310
77, 770, 68

------数据表二------

A1, B1, C1, D2
4, 44, 43,4
3, 32, 310,5
77, 770, 68,6

------等等-----

相关问题:

一旦这个矩阵被拆分和重铸,了解新数据结构及其组件的维度以及如何单独访问它们变得很重要,这将在下面讨论:

R Finding Multidimension Array Dimension Sizes

2 个答案:

答案 0 :(得分:2)

我们可以使用acast来转换“长”字样。广泛的'格式。生成的数据集将为matrix

library(reshape2)
acast(df1, Column_Two~Column_One, value.var="Column_Three")
#   A   B   C
#1  4  44  43
#2  3  32 310
#3 77 770  68

对于第二个数据集,我们可以通过" Column_Zero" split然后循环遍历list并像以前一样执行acast

 lst <- lapply(split(df2[-1], df2$Column_Zero), function(x) 
         acast(x, Column_Two~Column_One,value.var="Column_Three"))

lst
#$XX
#   A   B   C
#1  4  44  43
#2  3  32 310
#3 77 770  68

#$YY
#  A1  B1  C1 D2
#1  4  44  43  4
#2  3  32 310  5
#3 77 770  68  6

答案 1 :(得分:1)

可能的tidyr / dplyr解决方案:

library(dplyr)
library(tidyr)

df %>% spread(Column_One, Column_Three) %>% select(2:4)

#   A   B   C
#1  4  44  43
#2  3  32 310
#3 77 770  68
相关问题