我有這個資料集
dat=structure(list(A = c("n",
"n", "F", "F"), Par = c(1,
1, 8, 3), var = c(1, 10, 1,5), dat = c("T",
"T", "T", "T")), row.names = c(NA, 4L
), class = "data.frame")
我想按 A 中的組添加,我試過這不起作用:
dat%>%group_by(A)%>% mutate(ye = c( "40-25", "25-200"))
錯誤: !分配的資料value必須與現有資料兼容。? 現有資料有 4 行。? 分配的資料有 2 行。? 僅回收大小為 1 的向量。運行rlang::last_error()以查看錯誤發生的位置。
期望的輸出:
A Par var dat ye
1 n 1 1 T "40-25"
2 n 1 10 T "25-200"
3 F 8 1 T "40-25"
4 F 3 5 T "25-200"
uj5u.com熱心網友回復:
如果我了解您的目標,您可以按組拆分并按ye組順序添加您的值:
library(dplyr)
library(purrr)
dat %>%
group_by(A) %>%
group_split() %>%
map2_dfr(
c("40-25", "25-200"),
~ mutate(.x, ye = .y)
)
# A tibble: 4 × 5
A Par var dat ye
<chr> <dbl> <dbl> <chr> <chr>
1 F 8 1 T 40-25
2 F 3 5 T 40-25
3 n 1 1 T 25-200
4 n 1 10 T 25-200
相反,如果您想ye根據 的特定值創建A,請參閱@SamR 的答案或使用dplyr::recode():
dat %>%
mutate(ye = recode(
A,
F = "40-25",
n = "25-200"
))
uj5u.com熱心網友回復:
我無法用代碼原樣重現您的錯誤 - 它會產生所需的輸出。但是,如果我添加一個額外的行,我可以:
dat[5, ] <- dat[4, ]
dat
# A Par var dat
# 1 n 1 1 T
# 2 n 1 10 T
# 3 F 8 1 T
# 4 F 3 5 T
# 5 F 3 5 T
dat%>%group_by(A)%>% mutate(ye = c( "40-25", "25-200"))
Error in `mutate()`:
! Problem while computing `ye = c("40-25", "25-200")`.
x `ye` must be size 3 or 1, not 2.
i The error occurred in group 1: A = "F".
Run `rlang::last_error()` to see where the error occurred.
這是因為您現在有奇數行,如果您嘗試回收它,長度為 2 的向量會導致錯誤。
在不為偶數/奇數行設定單獨邏輯的情況下解決此問題的一種方法是為每個組創建一個所需長度的向量,并按行號將其子集:
dat |>
group_by(A) |>
mutate(
ye= rep(vals_to_replace, ceiling(n()/length(vals_to_replace)))[row_number()]
)
# # A tibble: 5 x 5
# # Groups: A [2]
# A Par var dat ye
# <chr> <dbl> <dbl> <chr> <chr>
# 1 n 1 1 T 40-25
# 2 n 1 10 T 25-200
# 3 F 8 1 T 40-25
# 4 F 3 5 T 25-200
# 5 F 3 5 T 40-25
這將確保每個新組都將從向量的開頭開始,即"40-25"在這種情況下。
基礎 R 溶液
您也可以在基礎 R 中執行此操作:
dat |>
split(~A) |>
lapply(\(df) {
times_to_repeat = nrow(df)/length(vals_to_replace)
remainder = nrow(df) %% length(vals_to_replace)
df$ye <- c(
rep(vals_to_replace, times_to_repeat),
vals_to_replace[seq_len(remainder)]
)
df
}) |>
bind_rows()
好的bind_rows(),從技術上講,dplyr但我更喜歡它,因為它在管道中效果更好,并且洗掉了行名。%>% do.call(rbind, .)如果您需要在基礎 R 中執行此操作,您可以將其替換為。
uj5u.com熱心網友回復:
可能你可以試試summarise_all unnest
library(dplyr)
library(tidyr)
dat %>%
group_by(A) %>%
summarise_all(list) %>%
mutate(ye = list(c("40-25", "25-200"))) %>%
unnest(cols = c(Par, var, dat, ye))
這使
A Par var dat ye
<chr> <dbl> <dbl> <chr> <chr>
1 F 8 1 T 40-25
2 F 3 5 T 25-200
3 n 1 1 T 40-25
4 n 1 10 T 25-200
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/524526.html
標籤:rdplyr
