【问题标题】:How to recombine values after a split in R?在 R 中拆分后如何重新组合值?
【发布时间】:2015-05-10 14:23:01
【问题描述】:

我有一个数据变量 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

【问题讨论】:

  • 请提供一个可重现的例子。
  • matrix(S, ncol=3, byrow=TRUE, dimnames = list(paste0("V", 41:43), paste0("V", 31:33))) 会给你你想要的矩阵。不过,可能有一种更直接的方式使用您的原始数据。

标签: r split lapply


【解决方案1】:

使用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"))

【讨论】:

  • 正是我需要的。问题,我如何访问各个元素?
  • @ReedRichards 您可以使用行/列索引来访问元素。假设,如果res &lt;- xtabs(values....); res[1,1]#[1] 0.5
【解决方案2】:

使用 reshape2 库我首先 melt 向量 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

【讨论】:

  • 也许这个例子不是很清楚,但例如 v31.v41 是 v31 和 v41 的串联。我的数据中的 v31 可能是像“xfwfsefg”这样的字符串,也就是说,没有像“\\.v[[:digit:]]+”这样的模式。对此感到抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
相关资源
最近更新 更多