我有一個資料框
A 2
B 4
C 3
我想用以下內容制作一個資料框
A 0
A 1
B 0
B 0
B 0
B 1
C 0
C 0
C 1.
所以對于B,我想制作4行,除了最后一行是1之外,每一行都是0。同樣,對于A,我將有2行,第一行有0,第二行有1。
一般來說,如果我在原始表中有一行X n,我想在新表中回傳 n 行,其中 n-1 為X 0,最后一個為X 1。
有沒有辦法在 R 中做到這一點?還是 Python 或 SQL?
uj5u.com熱心網友回復:
在R中,我們可以通過將第一列轉換為邏輯列 ( )uncount來復制第二列中的行并用二進制替換第二列duplicated
library(tidyr)
library(dplyr)
df1 %>%
uncount(v2) %>%
mutate(v2 = (!duplicated(v1, fromLast = TRUE)))
-輸出
v1 v2
1 A 0
2 A 1
3 B 0
4 B 0
5 B 0
6 B 1
7 C 0
8 C 0
9 C 1
或在Python
import pandas as pd
df1 = pd.DataFrame({"v1":["A", "B", "C"], "v2": [2, 4, 3]})
df2 = df1.reindex(df1.index.repeat(df1.v2))
df2['v2'] = (~df2.duplicated(subset = ['v2'], keep = "last")) 0
df2
v1 v2
0 A 0
0 A 1
1 B 0
1 B 0
1 B 0
1 B 1
2 C 0
2 C 0
2 C 1
資料
df1 <- structure(list(v1 = c("A", "B", "C"), v2 = c(2L, 4L, 3L)),
class = "data.frame", row.names = c(NA,
-3L))
uj5u.com熱心網友回復:
使用base R并不難......
d <- data.frame(x = LETTERS[1:3], n = c(2L, 4L, 3L))
d
## x n
## 1 A 2
## 2 B 4
## 3 C 3
data.frame(x = rep.int(d$x, d$n), i = replace(integer(sum(d$n)), cumsum(d$n), 1L))
## x i
## 1 A 0
## 2 A 1
## 3 B 0
## 4 B 0
## 5 B 0
## 6 B 1
## 7 C 0
## 8 C 0
## 9 C 1
uj5u.com熱心網友回復:
# load package
library(data.table)
# set as data table
setDT(df)
# work
df1 <- df[rep(seq(.N), b), ][, c := 1:.N, a]
df1[, d := 0][b == c, d := 1][, b := d][, c('c', 'd') := NULL]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/426660.html
