如何为每个ID重塑具有多个值的数据框? (如excel中的数据透视表)

时间:2018-11-10 09:18:46

标签: r

我有这个数据框:

data <- data.frame(id=sample(1:10,2000,replace = T),value=sample(100:10000,2000,replace = T))
> head(data)
  id value
1  4  2032
2  3  2512
3  9  8925
4  8  8527
5  6  5176
6  9  8182

现在,我希望每个value的{​​{1}}为id,并且值将是与id对应的行。

我想要的不是汇总,而是根据colnames将值分组,并且需要将id转换为列。

4 个答案:

答案 0 :(得分:1)

这应该有效:

library(tidyverse)

data %>% 
  group_by(id = paste("id", id, sep = "_")) %>%
  mutate(rn = row_number()) %>%
  spread(id, value) %>%
  select(-rn)

输出(前10行):

    id_1 id_10  id_2  id_3  id_4  id_5  id_6  id_7  id_8  id_9
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1  8161   576  4921  5965  8969  8419  7898  5724  6513  7475
 2  8526  8121  5200  7847  4033  9348  5051  4430  9320  2973
 3  4587  4505  1747  6179  6358   234  5649  5780  3579  4986
 4  2609  9058  5709  4284  4068   523  9156  3253  6753  5570
 5  1261  4533  5954  7703  2460  2171  4196  7576  7118  8702
 6  3125  8303  2364  9305  9094  1211  3439  8201  5268  6794
 7  3464   657  2917  4831  6154  3125  9964  9324  1917  7439
 8  6601  2297  4163  7866  6701  6336   262  6725  7646  5361
 9  3042  4296  9312  8990   366  5891  3984  4675  7289  9549
10  4829  5565  8841   775  5482  9519  1084  1845  4735  3467
# ... with 203 more rows

数据集的尾部如下:

   id_1 id_10  id_2  id_3  id_4  id_5  id_6  id_7  id_8  id_9
  <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1  2723    NA    NA    NA    NA    NA    NA    NA  7147    NA
2  7746    NA    NA    NA    NA    NA    NA    NA  1809    NA
3  4281    NA    NA    NA    NA    NA    NA    NA  8140    NA
4    NA    NA    NA    NA    NA    NA    NA    NA  6564    NA
5    NA    NA    NA    NA    NA    NA    NA    NA  6001    NA
6    NA    NA    NA    NA    NA    NA    NA    NA  3471    NA

答案 1 :(得分:1)

首先按ID将部分数据帧分割为一个临时列表。

ls1 <- lapply(sort(unique(data$id)), function(x) data[data$id == x, ])

第二,为每个ID的值编号,然后将所有内容汇总回原始数据帧结构中。

data <- do.call(rbind, 
                lapply(1:(length(ls1)), 
                       function(x) transform(ls1[[x]], 
                                             time=1:length(ls1[[x]][[1]]))))
rm(ls1)  # remove tmp list

最后使用reshape()

result <- reshape(data, idvar="time", timevar="id", direction="wide")

产量:

> head(result)
   time value.1 value.2 value.3 value.4 value.5 value.6 value.7 value.8 value.9 value.10
25    1    8097    8445    7029    3001    2823    7371    8359    6504    8902     9901
35    2     565    6701    6765    1187     116    9527    1680    3701    8514     4441
37    3    5383    5311    1073    9261    7899    6894    2297    1335    2910     5700
43    4    4885    6716    1608    6547    7379    5821    1295     866     702     8029
55    5    7721    8430    5324    6937     195    5758    1704    8017    9744     2062
71    6    4537    7004    8477    2071    9130    2072    4455    6628    6076     3888

> dim(result)
[1] 226  11

数据:

set.seed(42)
data <- data.frame(id=sample(1:10, 2000, replace=TRUE),
                   value=sample(100:10000, 2000, replace=TRUE))

答案 2 :(得分:0)

问题是您必须具有唯一的ID值,即列不能重复。

Company: Test

输出

library(tidyr)

set.seed(999)
data<-data.frame(id=sample(1:10,2000,replace = T),value=sample(100:10000,2000,replace = T))

# reshape to wide format
oo <- data %>% 
  distinct(id, .keep_all = TRUE) %>% 
  spread(id, value)

# rename columns, add prefix 'id'
colnames(oo) <- sapply(colnames(oo), function(x) paste0("id_", x))

答案 3 :(得分:0)

第一步是创建一个列表,其中每个元素对应一个id:

l <- tapply(data$value, data$id, list)
l["2"]
# $`2`
#   [1] 3961 2644 4194 3630 2485  353 6801 4487 9770 5793 9291 7071 1842
#  [14] 1970 6200 6499 4067 2968 3879 1677 3964 4934 5891 7502 7333 7742
#  ....

实际上,出于大多数目的,建议使用此数据结构,而不要使用您在问题中要问的内容。鉴于此,我们有多个长度不相等的向量,我们想cbind。如何做到这一点有很多建议(例如,参见here)。例如,

library(qpcR)
result <- do.call(qpcR:::cbind.na, l)
head(result, 2)
#         1    2    3    4    5    6    7    8    9   10
# [1,] 3118 6938 2360 9680 1540 4900 1427  680 3020 3824
# [2,] 4430 9265 4275 3689  624 6713  196 4605 9439  190
tail(result, 2)
#         1  2  3  4    5  6  7  8  9 10
# [212,] NA NA NA NA 1775 NA NA NA NA NA
# [213,] NA NA NA NA 9398 NA NA NA NA NA