首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按ID分列的一行数据

按ID分列的一行数据
EN

Stack Overflow用户
提问于 2014-03-14 16:26:53
回答 2查看 76关注 0票数 2

我有一个有一个id列的数据框架,还有几个按耦合分组的其他列,我试图将同一id的所有数据放在一行上。ID的出现次数各不相同。

我的数据如下:

代码语言:javascript
复制
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

现在我想到了这个:

代码语言:javascript
复制
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。

但我无法想象没有更容易的方法..。

谢谢你的建议

也许已经有解决办法了,但我没找到.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-14 17:48:58

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

代码语言:javascript
复制
df <- data.frame(id=sample(1:4, 12, T), vpcc=1:12, hpcc1=rnorm(12),
                 hpcc2=rnorm(12),hpcc3=rnorm(12))

然后使用reshape(),您将在一个行中得到每个id的所有值,其中的列对应于vpcc值,因此当vpcc5时,"hpcc3.5"就意味着hpcc3

代码语言:javascript
复制
reshape(df, idvar = "id", direction = "wide", timevar = "vpcc")

编辑

如果vpccX有变化,那么也许这会给你所需要的?

代码语言:javascript
复制
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$time = ave(df$id, df$id, FUN = function(x) 1:length(x))
reshape(df, idvar = "id", direction = "wide", timevar = "time")

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

票数 1
EN

Stack Overflow用户

发布于 2014-03-14 17:47:07

当您说“同一行”时,输出是否有必要与您的尝试中的输出相同,或者您是否对以下内容感到满意:

代码语言:javascript
复制
x <- aggregate(df[2:ncol(df)],list(df$id),list)

它允许您以下列方式查看一行的输出:

代码语言:javascript
复制
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的不同值:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22410678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档