我有如下資料
ID X1 X2 X3 X4
A 3 4 5 6
B 5 7 9 2
C 8 5 2 6
我需要添加額外的行,其中包含所選行的乘法。資料應如下所示。
ID X1 X2 X3 X4
A 3 4 5 6
B 5 7 9 2
C 8 5 2 6
AB 15 28 45 12
BC 40 35 18 12
我怎樣才能轉換它?謝謝,安巴。
uj5u.com熱心網友回復:
與對的順序無關的編程解決方案可能是:
row_comb <- list(c("A", "B"), c("B", "C"))
df %>%
bind_rows(map(keep(combn(df[["ID"]], 2, simplify = FALSE), function(x) any(map_lgl(row_comb, function(y) all(y %in% x)))),
~ df %>%
filter(ID %in% .x) %>%
summarise(across(ID, ~ paste(., collapse = "")),
across(-ID, prod))))
ID X1 X2 X3 X4
1 A 3 4 5 6
2 B 5 7 9 2
3 C 8 5 2 6
4 AB 15 28 45 12
5 BC 40 35 18 12
uj5u.com熱心網友回復:
library(tidyverse)
df <- data.frame(
ID = c("A", "B", "C"),
X1 = c(3L, 5L, 8L),
X2 = c(4L, 7L, 5L),
X3 = c(5L, 9L, 2L),
X4 = c(6L, 2L, 6L)
)
PROD <- list(c("A", "B"), c("B", "C"))
nm <- map_chr(PROD, paste, collapse = "")
fltr <- sapply(PROD, function(x) df$ID %in% x) %>%
as.data.frame() %>%
set_names(nm = nm)
PROD_RES <- map(fltr, ~filter(.data = df, .x)) %>%
map_df(~summarise(.data = .x, across(where(is.numeric), prod)), .id = "ID")
result <- bind_rows(df, PROD_RES)
result
#> ID X1 X2 X3 X4
#> 1 A 3 4 5 6
#> 2 B 5 7 9 2
#> 3 C 8 5 2 6
#> 4 AB 15 28 45 12
#> 5 BC 40 35 18 12
使用reprex v2.0.2創建于 2022-10-16
uj5u.com熱心網友回復:
檢查一下:基本思想是對子集執行乘法運算,得到兩個臨時資料幀,然后將三個資料幀系結在一起:
library(dplyr)
# first subset:
df1 <- df %>%
filter(ID %in% c("A", "B")) %>%
summarise(across(starts_with("X"), ~.x * lag(.x))) %>%
mutate(ID = "AB")
# second subset:
df2 <- df %>%
filter(ID %in% c("B", "C")) %>%
summarise(across(starts_with("X"), ~.x * lag(.x))) %>%
mutate(ID = "BC")
# bind original `df` together with `df1` and `df2`:
bind_rows(df, df1 %>% filter(complete.cases(.)), df2 %>% filter(complete.cases(.))
ID X1 X2
1 A 3 4
2 B 5 7
3 C 7 5
4 AB 15 28
5 BC 35 35
編輯:
基于@Darren Tsai 非常有用的指標,我們可以縮短代碼,因此:
df1 <- df %>%
filter(ID %in% c("A", "B")) %>%
summarise(across(starts_with("X"), prod)) %>%
mutate(ID = "AB")
df2 <- df %>%
filter(ID %in% c("B", "C")) %>%
summarise(across(starts_with("X"), prod)) %>%
mutate(ID = "BC")
bind_rows(df, df1, df2)
資料:
df <- data.frame(
ID = c("A", "B", "C"),
X1 = c(3,5,7),
X2 = c(4,7,5)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515266.html
標籤:r
