ID上一行的数据

时间:2014-03-14 16:26:53

标签: r

我有一个数据框,其中一个id列和几个其他列按夫妇分组,我试图将同一个id的所有数据放在一行上。 ID的出现次数不同。

我的数据如下:

df <- data.frame(id=sample(1:4, 12, T), vpcc1=1:12, hpcc1=rnorm(12), vpcc2=1:12, hpcc2=rnorm(12), vpcc3=1:12, hpcc3=rnorm(12))
df
##    id vpcc1       hpcc1 vpcc2       hpcc2 vpcc3       hpcc3
## 1   1     1  0.04632267     1 -0.37404379     1  0.90711353
## 2   4     2  0.50383152     2  0.06075954     2  0.30690284
## 3   1     3  1.52450117     3 -1.21539925     3 -1.12411614
## 4   1     4 -0.50624871     4 -0.75988364     4 -0.47970608
## 5   3     5  1.64610863     5  0.03445275     5 -0.18895338
## 6   1     6  0.22019099     6 -0.32101883     6  1.29375822
## 7   2     7 -0.10041807     7 -0.17351799     7 -0.03767921
## 8   2     8  0.81683565     8  0.62449158     8  0.50474787
## 9   2     9 -0.46891269     9  1.07743469     9 -0.55539149
## 10  1    10  0.69736549    10 -0.08573679    10  0.28025325
## 11  3    11  0.73354215    11  0.80676315    11 -1.12561358
## 12  2    12 -0.40903143    12  1.94155313    12  0.64231119

目前我想出了这个:

align2 <- function(df) {
  result <- lapply(1:nrow(df), function(j) lapply(1:3, function(i) {x <- df[j,         paste0(c("vpcc", "hpcc"), i)]
                                                                  names(x) <-     paste0(c("vpcc", "hpcc"), (i + (j-1)*4))
                                                                  return(x)}))
  result2 <- lapply(result, function(x) do.call(cbind, x))
  result3 <- do.call(cbind, result2)
  return(result3)
}
testX <- lapply(1:4, function(k) align2(as.data.frame(split(df, f=df$id)[[k]])))
library(plyr)
testX2 <- do.call(rbind.fill, testX)
testX2
##   vpcc1       hpcc1 vpcc2       hpcc2 vpcc3       hpcc3 vpcc4     hpcc4 vpcc5      hpcc5 vpcc6      hpcc6 vpcc7      hpcc7 vpcc8      hpcc8 ...
## 1     1  0.04632267     1 -0.37404379     1  0.90711353     3 1.5245012     3 -1.2153992     3 -1.1241161     4 -0.5062487     4 -0.7598836 ...
## 2     7 -0.10041807     7 -0.17351799     7 -0.03767921     8 0.8168356     8  0.6244916     8  0.5047479     9 -0.4689127     9  1.0774347 ...
## 3     5  1.64610863     5  0.03445275     5 -0.18895338    11 0.7335422    11  0.8067632    11 -1.1256136    NA         NA    NA         NA ...
## 4     2  0.50383152     2  0.06075954     2  0.30690284    NA        NA    NA         NA    NA         NA    NA         NA    NA         NA ...

这是一个部分解决方案,因为它没有保留id。

但我无法想象没有更简单的方法......

感谢您的建议

PS:也许已经有了SO的解决方案,但我没有找到它......

2 个答案:

答案 0 :(得分:1)

在您的示例中,变量vpcc1 vpcc2等是多余的,因为它们具有相同的值。因此,您可以将数据集转换为更经济的结构:

df <- data.frame(id=sample(1:4, 12, T), vpcc=1:12, hpcc1=rnorm(12),
                 hpcc2=rnorm(12),hpcc3=rnorm(12))

然后使用reshape(),您将在一行中拥有每个id的所有值,其中列对应于vpcc值,因此"hpcc3.5"表示{{1}当hpcc3vpcc时。

5

修改

如果reshape(df, idvar = "id", direction = "wide", timevar = "vpcc") 变化,那么这可能会给你所需要的东西吗?

vpccX

当然,如果需要,您可以重命名变量。

答案 1 :(得分:0)

当你说'#34;同一行&#34;时,是否有必要输出就像你的尝试一样,或者你会对以下内容感到满意:

x <- aggregate(df[2:ncol(df)],list(df$id),list)

允许您将一行的输出视为:

x
#  Group.1           vpcc1                                                          hpcc1           vpcc2                                                         hpcc2           vpcc3
#1       1           9, 10                                           1.4651392, 0.8581344           9, 10                                           -1.621135, 1.391945           9, 10
#2       2         1, 3, 7                                  2.784998, 1.667367, -1.329005         1, 3, 7                              0.2115051, 0.7871399, -0.4835389         1, 3, 7
#3       3            5, 6                                          -0.5024987, 0.2822224            5, 6                                            0.155844, 1.336449            5, 6
#4       4 2, 4, 8, 11, 12 -0.48563550, -0.92684024, -0.04016263, -0.41861021, 0.02309864 2, 4, 8, 11, 12 -0.17304058, 0.25428404, -0.49897995, 0.03101927, -0.13529866 2, 4, 8, 11, 12
#                                                          hpcc3
#1                                       -0.05182822, 0.28365514
#2                          -0.06189895, -0.83640652, 0.19425789
#3                                     -0.006440312, 1.378218706
#4 0.09412386, 0.16733125, -1.15198965, -1.00839015, -0.16114475

并使用列表表示法引用vpcc和hpcc的不同值:

x$vpcc1
#$`0`
#[1]  9 10

#$`1`
#[1] 1 3 7

#$`2`
#[1] 5 6

#$`3`
#[1]  2  4  8 11 12

x$vpcc1[[1]]
#[1]  9 10