我有一個包含 3 列的表:
- 范圍開始
- 范圍結束
- 分配給范圍內所有值的數字。
我想創建一個表,第一列的值為 1-x(x 是所有范圍的總和),第二列的每個值都分配有編號。任何未分配的值都需要設定為 0。
例如原始表:
| 開始 | 結尾 | 價值 |
|---|---|---|
| 1 | 4 | -1 |
| 6 | 8 | 4 |
所以決賽桌將是:
| 數字 | 價值 |
|---|---|
| 1 | -1 |
| 2 | -1 |
| 3 | -1 |
| 4 | -1 |
| 5 | 0 |
| 6 | 4 |
| 7 | 4 |
| 8 | 4 |
但我不知道從哪里開始 - 有什么建議嗎?
謝謝。
uj5u.com熱心網友回復:
這行得通嗎?從您的資料示例開始
library(dplyr)
a = data.frame(start= c(1,6),end=c(4,8),value=c(-1,4))
c= apply(a, 1,function(i){
b = i[1]:i[2]
return(as.data.frame(cbind(b, rep(i[3], length(b)))))
})
c = bind_rows(c, .id = "column_label")[,-1]
d= (c[1,1]:c[nrow(c),1])[!c[1,1]:c[nrow(c),1]%in%c$b]
d= cbind(d, rep(0, length(d)))
colnames(d)=colnames(c)
res = rbind(c,d)[order(rbind(c,d)[,1]),]
rownames(res)= 1:nrow(res)
colnames(res)=c('Number', 'Value')
res
輸出:
> res
Number Value
1 1 -1
2 2 -1
3 3 -1
4 4 -1
5 5 0
6 6 4
7 7 4
8 8 4
uj5u.com熱心網友回復:
強制性的“data.table”解決方案;),可以使用“foverlaps”獲得通用解決方案
library(data.table)
data <- data.frame(start = c(1, 6), end= c(4, 8), value = c(-1, 4))
number <- data.frame(start = c(1:8), end = c(1:8))
setDT(data)
setDT(number)
setkey(data, start, end)
df<-foverlaps(number, data)[, c("i.start", "value"),
with = FALSE]
df[is.na(df$value), ]$value <- 0
uj5u.com熱心網友回復:
這是一個整潔的解決方案:
library(dplyr)
library(tidyr)
df %>%
group_by(start) %>%
mutate(index = list(start:end)) %>%
unnest(cols = c(index)) %>%
ungroup() %>%
complete(index = 1:max(index), fill = list(value = 0)) %>%
select(Number=index, Value=value)
Number Value
<int> <dbl>
1 1 -1
2 2 -1
3 3 -1
4 4 -1
5 5 0
6 6 4
7 7 4
8 8 4
uj5u.com熱心網友回復:
如果你正在尋找一個通用的解決方案,你可以試試這個功能
expand_integers <- function(start, end, value) {
n <- end - start 1L
rng <- range(c(start, end))
pos <- sequence(n, start - rng[[1L]] 1L)
val <- rep.int(value, n)
data.frame(
number = seq.int(rng[[1L]], rng[[2L]]),
value = `[<-`(integer(rng[[2L]] - rng[[1L]] 1L), pos, value = val)
)
}
它適用于任何start和end價值觀,是非常有效的。這是一個簡單的測驗:
df <- data.frame(start = c(4L, 10L), end = c(7L, 19L), value = c(-1L, 4L))
df
expand_integers(df$start, df$end, df$value)
輸出
> df
start end value
1 4 7 -1
2 10 19 4
> expand_integers(df$start, df$end, df$value)
number value
1 4 -1
2 5 -1
3 6 -1
4 7 -1
5 8 0
6 9 0
7 10 4
8 11 4
9 12 4
10 13 4
11 14 4
12 15 4
13 16 4
14 17 4
15 18 4
16 19 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408932.html
標籤:
