내 데이터는 다음과 같은 구조를 가지고 있습니다. 각 국가 및 ID에 대해 배송 열 (중국 및 홍콩)에서 그룹에 중국과 홍콩이 모두있는 경우 새 열 배송에 홍콩이 있어야합니다 (그룹에 중국이있는 경우), 새 열 배송에는 중국이 있어야합니다 (그룹에 중국이있는 경우). HK, 새 열 배송에는 해당 없음 인 경우 HK가 있어야하며 NA 여야합니다.
M, Q 및 Y 열과 유사합니다. 주어진 그룹에 대한 값이있는 열에 따라 단일 열 기간에 속해야합니다.
아래에 내 시도를 포함했습니다. 하지만 더 나은 방법이 있는지 궁금합니다. true 또는 false 대신 shipment_hk
또는 shipment_china
. 사용자가 읽을 수 있도록합니다. 또한 분기 별 가치는 ifelse 조건에서 작동하지 않는 것 같습니다.
library(dplyr)
sample_df %>% tibble::as.tibble() %>%
dplyr::group_by(country,id) %>%
dplyr::mutate(periods = ifelse(Monthly == "Monthly", "monthly", ifelse(Quarterly == "Quarterly", "quarterly", ifelse(Yearly == "Yearly", "yearly", "")))) %>%
dplyr::mutate(shipment = any(shipment_hk %in% "send to hk")) %>%
dplyr::select(country,id, type,periods,shipment)
#> # A tibble: 20 x 5
#> # Groups: country, id [7]
#> country id type periods shipment
#> <chr> <chr> <chr> <chr> <lgl>
#> 1 group_1 2.1 "" <NA> FALSE
#> 2 group_1 2.1 "bar" monthly FALSE
#> 3 group_1 2.1 "chocolate" monthly FALSE
#> 4 group_1 2.17 "" <NA> FALSE
#> 5 group_1 2.17 "bar" monthly FALSE
#> 6 group_1 2.17 "chocolate" monthly FALSE
#> 7 group_1 2.2 "" <NA> TRUE
#> 8 group_1 2.2 "" <NA> TRUE
#> 9 group_1 2.2 "bar" <NA> TRUE
#> 10 group_1 2.2 "chocolate" <NA> TRUE
#> 11 group_2 1 "" <NA> TRUE
#> 12 group_2 1 "" <NA> TRUE
#> 13 group_2 1 "bar" monthly TRUE
#> 14 group_2 2.1 "" <NA> FALSE
#> 15 group_2 2.1 "bar" monthly FALSE
#> 16 group_2 2.12.1 "" <NA> TRUE
#> 17 group_2 2.12.1 "" <NA> TRUE
#> 18 group_2 2.12.1 "donut" <NA> TRUE
#> 19 group_2 2.12.2 "" <NA> FALSE
#> 20 group_2 2.12.2 "bar" <NA> FALSE
reprex 패키지 (v0.3.0)로 2020-11-03에 생성
dput(sample_df)
structure(list(country = c("group_1", "group_1", "group_1", "group_1",
"group_1", "group_1", "group_1", "group_1", "group_1", "group_1",
"group_2", "group_2", "group_2", "group_2", "group_2", "group_2",
"group_2", "group_2", "group_2", "group_2", "group_3", "group_3",
"group_3", "group_3", "group_3", "group_3"), id = c("2.1", "2.1",
"2.1", "2.17", "2.17", "2.17", "2.2", "2.2", "2.2", "2.2", "1",
"1", "1", "2.1", "2.1", "2.12.1", "2.12.1", "2.12.1", "2.12.2",
"2.12.2", "2.17", "2.17", "2.17", "2.18", "2.18", "2.18"), type = c("",
"bar", "chocolate", "", "bar", "chocolate", "", "", "bar", "chocolate",
"", "", "bar", "", "bar", "", "", "donut", "", "bar", "tiles",
"tiles", "tiles", "tiles", "tiles", "tiles"), shipment_china = c("send to china",
NA, NA, "send to china", NA, NA, "send to china", NA, NA, NA,
"send to china", NA, NA, "send to china", NA, "send to china",
NA, NA, "send to china", NA, NA, NA, NA, NA, NA, NA), shipment_hk = c(NA,
NA, NA, NA, NA, NA, NA, "send to hk", NA, NA, NA, "send to hk",
NA, NA, NA, NA, "send to hk", NA, NA, NA, NA, NA, NA, NA, NA,
NA), Monthly = c(NA, "Monthly", "Monthly", NA, "Monthly", "Monthly",
NA, NA, NA, NA, NA, NA, "Monthly", NA, "Monthly", NA, NA, NA,
NA, NA, NA, "Monthly", NA, NA, NA, NA), Quarterly = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "Quarterly",
NA, "Quarterly", NA, NA, NA, "Quarterly", NA, NA), Yearly = c(NA,
NA, NA, NA, NA, NA, NA, NA, "Yearly", "Yearly", NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA,
-26L))
중첩 대신 사용 coalesce
및 사용 case_when
하는 한 가지 방법 ifelse
:
library(dplyr)
sample_df %>%
group_by(country, id) %>%
mutate(periods = coalesce(Monthly, Quarterly, Yearly),
shipment = case_when(
any(shipment_hk == "send to hk") ~ "send to hk",
any(shipment_china == "send to china") ~ "send to china",
TRUE ~ NA_character_
))
이 우선 순위 것 shipment_hk
이상 shipment_china
새에 shipment
열입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다