我有这个数据框:
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
转换为列。
答案 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