如何在R中拆分后重新组合值?

时间:2015-05-10 14:23:02

标签: r split lapply

我有一个数据变量X,我已经完成了以下

Xnew = split(X$col1,list(X$col3,X$col4))
S = sapply(Xnew,mean)

我现在有一个向量,其中每个元素都可以通过

访问
S['SomeValCol3.SomeValCol4']

现在我想创建一个包含列等于col3中唯一值数的向量,其中col4作为索引每个值的列向量添加。也就是说,

Col4 | COL3 [1] | Col3 [2] | .... COL4 [0] | S [' SomeValCol3.SomeValCol4'] | ... 。 。

等等。

举一个例子,我可以说我有以下的载体

S['v31.v41'] = 0.5
S['v32.v41'] = 0.25
S['v33.v41'] = 0.35
S['v31.v42'] = 0.5
S['v32.v42'] = 0.25
S['v33.v42'] = 0.35
S['v31.v43'] = 0.5
S['v32.v43'] = 0.25
S['v33.v43'] = 0.35

我从分裂得到了然后我想要这个矩阵

V4 | V31 | V32 | V33
V41  0.5   0.25  035
V42  0.5   0.25  035
V43  0.5   0.25  035

2 个答案:

答案 0 :(得分:2)

使用base R

 xtabs(values~V1+V2, transform(stack(S), V2=sub('\\..*', '', ind),
                  V1=sub('.*\\.', '', ind)))
 #        V2
 #V1    v31  v32  v33
 # v41 0.50 0.25 0.35
 # v42 0.50 0.25 0.35
 # v43 0.50 0.25 0.35

数据

 S <- structure(c(0.5, 0.25, 0.35, 0.5, 0.25, 0.35, 0.5, 0.25, 0.35
 ), .Names = c("v31.v41", "v32.v41", "v33.v41", "v31.v42", "v32.v42", 
 "v33.v42", "v31.v43", "v32.v43", "v33.v43"))

答案 1 :(得分:1)

使用 reshape2 库我首先向量S融合到data.frame并添加行/列变量名称

library(reshape2)
S.melted <- melt(S)
S.melted$v1 <- gsub('\\.v[[:digit:]]+', '', rownames(S.melted))
S.melted$v2 <- gsub('\\v[[:digit:]]+\\.', '', rownames(S.melted))

给了我S.melted格式如下:

        value v1  v2
v31.v41  0.50 v31 v41
v32.v41  0.25 v32 v41
...

然后使用 acast

获取首选格式
> acast(S.melted, v1 ~ v2)
    v41  v42  v43
v31 0.50 0.50 0.50
v32 0.25 0.25 0.25
v33 0.35 0.35 0.35