다음과 같은 데이터 프레임이 있습니다.
id v t1 t2 t3 t4 date1 list1
1 1.0 1.4 2 0.45 3 2020-09-03 val1
1 1.0 1.6 3 0.55 3.7 2020-09-05 val2
id, v
각 열에 t1, t2, t3, t4, date1, list1
다른 집계 함수를 적용 하여 열 을 그룹화 하고 집계하는 방법은 무엇입니까 ? 더 구체적으로
t1 -> mean
t2 -> max
t3 -> mean
t4 -> max
date -> max
list1 -> join as in python's ','.join
따라서 집계 후 프레임은 다음과 같습니다.
id v t1 t2 t3 t4 date1 list1
1 1.0 1.5 3 0.5 3.7 2020-09-05 val1, val2
또한 한 가지 더, 이러한 열은 R 반짝이 프레임 워크에서 사용자 선택에 따라 동적으로 추가 될 수 있습니다. 즉, 집계하려는 모든 열이 데이터 프레임에 있지만 일부는 집계 할 필요가 없을 수 있습니다. 예를 들어 사용자 t1, date1
는 나머지 만 선택할 수 있습니다. 따라서 내 집계 매개 변수는 선택한 열에 따라 달라지며 사용자 선택에서 사용할 수있는 열 이름이 있습니다. 따라서 동적 집계 쿼리를 어떻게 작성할 수 있는지 묻는 것이 합리적 일 것입니다.
파이썬에서는 사용자가 선택한 열을 기반으로 위와 같은 사전을 동적으로 작성하고 다음과 같은 것을 사용할 수 있습니다. pd.agg(**dict)
R에서 어떻게 할 수 있습니까? dplyr :: summarise 및 data.table을 살펴 보려고했지만 한 번에 모두 집계 할 수없는 것 같습니다. 당신의 도움을 주셔서 감사합니다.
across
열 블록에 함수를 적용 하는 데 사용할 수 있습니다.
library(dplyr)
df1 %>%
group_by(id, v) %>%
summarise(across(c(t1, t3), mean),
across(c(t2, t4, date1), max),
list1 = toString(list1), .groups = 'drop')
-산출
# A tibble: 1 x 8
# id v t1 t3 t2 t4 date1 list1
# <int> <dbl> <dbl> <dbl> <int> <dbl> <chr> <chr>
#1 1 1 1.5 0.5 3 3.7 2020-09-05 val1, val2
함수, 열 이름이 모두 사용자 입력 인 경우
nm1 <- c("t1", "t3")
nm2 <- c("t2", "t4", "date1")
nm3 <- c("list1")
f1 <- "mean"
f2 <- "max"
f3 <- "toString"
df1 %>%
group_by(id, v) %>%
summarise(across(all_of(nm1), ~ match.fun(f1)(.)),
across(all_of(nm2), ~ match.fun(f2)(.)),
!! nm3 := match.fun(f3)(!! rlang::sym(nm3)), .groups = 'drop')
-산출
# A tibble: 1 x 8
# id v t1 t3 t2 t4 date1 list1
# <int> <dbl> <dbl> <dbl> <int> <dbl> <date> <chr>
#1 1 1 1.5 0.5 3 3.7 2020-09-05 val1, val2
표현식으로 전달하고 평가할 수도 있습니다.
expr1 <- glue::glue('across(c({toString(nm1)}), {f1});',
'across(c({toString(nm2)}), {f2});',
'across(c({toString(nm3)}), {f3})')
df1 %>%
group_by(id, v) %>%
summarise(!!! rlang::parse_exprs(expr1), .groups = 'drop')
-산출
# A tibble: 1 x 8
# id v t1 t3 t2 t4 date1 list1
# <int> <dbl> <dbl> <dbl> <int> <dbl> <date> <chr>
#1 1 1 1.5 0.5 3 3.7 2020-09-05 val1, val2
df1 <- structure(list(id = c(1L, 1L), v = c(1, 1), t1 = c(1.4, 1.6),
t2 = 2:3, t3 = c(0.45, 0.55), t4 = c(3, 3.7), date1 = structure(c(18508,
18510), class = "Date"), list1 = c("val1", "val2")), row.names = c(NA,
-2L), class = "data.frame")
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다