R:将数据框中的数据转换为列

Man*_*ria 2 r reshape dataframe

我有这样的数据帧

Tag   Date (DD/MM/YYYY)
AA    1/1/2010
AB    2/1/2010
AC    3/1/2010
AA    4/1/2010
AB    5/1/2010
AA    6/1/2010
AB    7/1/2010
AC    8/1/2010
Run Code Online (Sandbox Code Playgroud)

现在,有不同数量的不同标签,(平均不到10个).我需要的是以更加舒适的方式处理数据.我已经分析了Tag序列数据以找出更频繁重复的模式,在这种情况下它将是(AA,AB,AC).

现在,我想要的是将数据转换为这样的数据,因此我可以使用它.

AA        AB        AC
1/1/2010  2/1/2010  3/1/2010
4/1/2010  5/1/2010  NA
6/1/2010  7/1/2010  8/1/2010
Run Code Online (Sandbox Code Playgroud)

我已经看到了这个问题,将字段值转换为R数据框中的列名,并且它非常接近我的需要.这样做

>libray(reshape2)
>df<-sqldf("SELECT Tag, Date FROM validData")
>head(dcast(df,Date~Tag))
Run Code Online (Sandbox Code Playgroud)

产量

Using Date as value column: use value_var to override.
Aggregation function missing: defaulting to length

                Date  AF687A AVISOO B32D76 B3DC39 B52C72 DF7EAD DF8E83 DFA521 DFA91A
1 2010-12-23 09:18:50      0      0      0      0      1      0      0      0      0
2 2010-12-23 09:18:52      1      0      0      0      0      0      0      0      0
3 2010-12-23 09:18:54      0      0      0      0      1      0      0      0      0
4 2010-12-23 09:18:57      1      0      0      0      0      0      0      0      0
5 2010-12-23 09:18:58      0      0      0      0      1      0      0      0      0
6 2010-12-23 09:19:00      0      0      0      1      0      0      0      0      0
Run Code Online (Sandbox Code Playgroud)

我认为我很接近,但我无法弄清楚最后一步,就像在上面描述的压缩表格一样.有线索吗?

Aar*_*ica 6

Date将从Tag列中的模式计算要放入的行和列,然后只填充一个新矩阵.

首先设置要为每一行匹配的模式; 我将使用结果unique.如果第一组缺少值(除了最后一个值),这将无法正常工作.

pat <- unique(df$Tag)
Run Code Online (Sandbox Code Playgroud)

然后通过将标记与模式匹配来计算列,并通过注意新模式何时开始来计算该行.

col <- match(df$Tag, pat)
row <- cumsum(c(0,diff(col))<=0)
Run Code Online (Sandbox Code Playgroud)

然后创建矩阵并填充它!

out <- matrix(nrow=max(row), ncol=max(col))
colnames(out) <- pat
out[cbind(row, col)] <- df$Date
Run Code Online (Sandbox Code Playgroud)

结果是

> out
     AA         AB         AC        
[1,] "1/1/2010" "2/1/2010" "3/1/2010"
[2,] "4/1/2010" "5/1/2010" NA        
[3,] "6/1/2010" "7/1/2010" "8/1/2010"
Run Code Online (Sandbox Code Playgroud)