在下面,数据帧索引表示该值,而 t1:t2 表示该特定值在特定时间点被记录的次数。例如,t1 处的索引 10 等于 1,表明它有 1 个记录;在 t2 处有 4 条记录,整个 t3 和 t4 处只有 1 条记录。我想根据索引列返回 t1:t4 列中的值
输入:
index t1 t2 t3 t4
10 1 4 1 1
20 2 5 1 0
30 3 6 1 0
40 0 0 0 2
Output:
t1 t2 t3 t4
10 10 10 10
20 10 20 40
20 10 30 40
30 10 NA NA
30 20 NA NA
30 20 NA NA
NA 20 NA NA
NA 20 NA NA
NA 30 NA NA
NA 30 NA NA
NA 30 NA NA
NA 30 NA NA
NA 30 NA NA
NA 30 NA NA
Run Code Online (Sandbox Code Playgroud)
样本数据:
df<-structure(list(index=c (10,20,30,40),
t1 = c(1, 2, 3, 0),
t2 = c(4, 5, 6, 0),
t3 = c(1, 1,1, 0),
t4 = c(1, 0, 0, 2)), row.names = c(NA,4L), class = "data.frame")
df
Run Code Online (Sandbox Code Playgroud)
一dplyr,tidyr和purrr解决方案可能是:
map(.x = names(df)[-1],
~ df %>%
uncount(get(.x)) %>%
select(!!.x := index) %>%
rowid_to_column()) %>%
reduce(full_join)
rowid t1 t2 t3 t4
1 1 10 10 10 10
2 2 20 10 20 40
3 3 20 10 30 40
4 4 30 10 NA NA
5 5 30 20 NA NA
6 6 30 20 NA NA
7 7 NA 20 NA NA
8 8 NA 20 NA NA
9 9 NA 20 NA NA
10 10 NA 30 NA NA
11 11 NA 30 NA NA
12 12 NA 30 NA NA
13 13 NA 30 NA NA
14 14 NA 30 NA NA
15 15 NA 30 NA NA
Run Code Online (Sandbox Code Playgroud)
基础 R 和一行代码。
Map(function(x) rep(df$index, x), df[,-1])
Run Code Online (Sandbox Code Playgroud)
更新后:
maxy <- max(apply(df[,-1], 2, sum))
data.frame(Map(function(x) c(rep(df$index, x), rep(NA, maxy - sum(x))), df[,-1]))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |