我目前在這種形式的 R 中有一個資料框
city product inv pla
city1 product1 0 2
city1 product2 1 2
city1 product3 2 2
city1 product4 0 1
city1 product5 1 1
city1 product6 1 1
當 pla = 2 時,我需要復制行,但根據以下內容在 inv 列中放置一個值:
當 inv = 0 時,兩行必須等于 0。當 inv = 1 時,第一行必須等于 1,第二行必須等于 0。當 inv=2 時,兩行必須等于 1。
如何創建這樣的資料框?:
city product inv pla
city1 product1 0 2
city1 product1 0 2
city1 product2 1 2
city1 product2 0 2
city1 product3 1 2
city1 product3 1 2
city1 product4 0 1
city1 product5 1 1
city1 product6 1 1
uj5u.com熱心網友回復:
在這里,我拉出需要復制的行,根據需要對其進行修改,然后將它們重新粘貼到原始資料上:
df %>%
filter(pla == 2) %>%
mutate(inv = case_when(inv == 1 ~ 0L, TRUE ~ inv)) %>%
bind_rows(df) %>%
mutate(inv = case_when(inv == 2 & pla == 2 ~ 1L, TRUE ~ inv)) %>%
arrange(city, product, inv)
# city product inv pla
# 1 city1 product1 0 2
# 2 city1 product1 0 2
# 3 city1 product2 0 2
# 4 city1 product2 1 2
# 5 city1 product3 1 2
# 6 city1 product3 1 2
# 7 city1 product4 0 1
# 8 city1 product5 1 1
# 9 city1 product6 1 1
uj5u.com熱心網友回復:
首先創建您的“第一行和第二行”值,分別將它們放入inv和inv2;然后使用 將它們旋轉到新行中tidyr::pivot_longer()。
library(dplyr)
library(tidyr)
mydata %>%
mutate(
inv2 = case_when(
pla == 1 ~ NA_real_,
inv < 2 ~ 0,
inv == 2 ~ 1
),
inv = if_else(inv == 2, 1, inv)
) %>%
pivot_longer(
c(inv, inv2),
names_to = NULL,
values_to = "inv",
values_drop_na = TRUE
)
#> # A tibble: 9 x 4
#> city product pla inv
#> <chr> <chr> <dbl> <dbl>
#> 1 city1 product1 2 0
#> 2 city1 product1 2 0
#> 3 city1 product2 2 1
#> 4 city1 product2 2 0
#> 5 city1 product3 2 1
#> 6 city1 product3 2 1
#> 7 city1 product4 1 0
#> 8 city1 product5 1 1
#> 9 city1 product6 1 1
由reprex 包于 2022-03-16 創建(v2.0.1)
uj5u.com熱心網友回復:
基礎 R 溶液
data <- read.table(text = "city product inv pla
city1 product1 0 2
city1 product2 1 2
city1 product3 2 2
city1 product4 0 1
city1 product5 1 1
city1 product6 1 1", header = TRUE)
data_final <- data[rep(seq_len(nrow(data)), data$pla), ]
which_rep <- data_final$pla == 2
data_final$inv[which_rep] <- data_final$inv[which_rep] / 2
data_final$inv[which_rep & data_final$inv == 0.5] <- c(1, 0)
rownames(data_final) <- NULL
data_final
uj5u.com熱心網友回復:
創建一個函式f來制作每個組所需的值向量,然后使用 tidyr::separate_rows.
library(tidyverse)
f <- function(x, n){
sapply(x, function(y) paste(c(rep(1, y), rep(0, length.out = n - y)), collapse = " "))
}
dat %>%
mutate(inv = ifelse(pla == 2, f(inv, 2), inv)) %>%
separate_rows(inv)
輸出
# A tibble: 9 x 4
city product inv pla
<chr> <chr> <chr> <int>
1 city1 product1 0 2
2 city1 product1 0 2
3 city1 product2 1 2
4 city1 product2 0 2
5 city1 product3 1 2
6 city1 product3 1 2
7 city1 product4 0 1
8 city1 product5 1 1
9 city1 product6 1 1
uj5u.com熱心網友回復:
這是一種使用 data.table,然后使用 tidyr::unnest() 的方法。如果d是您的資料:
setDT(d)
rbind(d[pla==2][, inv:=fcase(inv==0,.(c(0,0)),inv==1,.(c(1,0)),inv==2,.(c(1,1)))],
d[pla==1]) %>% unnest(inv)
輸出:
city product inv pla
<chr> <chr> <dbl> <int>
1 city1 product1 0 2
2 city1 product1 0 2
3 city1 product2 1 2
4 city1 product2 0 2
5 city1 product3 1 2
6 city1 product3 1 2
7 city1 product4 0 1
8 city1 product5 1 1
9 city1 product6 1 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/445274.html
