나는 나의 지혜 끝에 있습니다. 내 파이프 라인에서 다소 간단한 mutate를 시도하고 있지만, 특정 예제의 경우 R은 작동을 거부합니다. 죄송합니다. 재현 가능한 예를 제공 할 수 없습니다 (아래에 언급 된 이유).
그래서 이것은 내 전체 파이프 라인입니다.
new <- old %>%
left_join(., lookup, by = "id") %>%
mutate(sum_0.95 = apply(across(starts_with("pred")), 1, function(x) {sum(x >= 0.95 & x < 1)}),
sum_le_0.5 = apply(across(starts_with("pred")), 1, function(x) {sum(x <= 0.5 & x > 0)}),
coding = case_when(pred_QC4A_code_10 == 0 | pred_QC4A_code_10 == 1 ~ "ABC",
sum_0.95 > 0 & (sum_0.95 + sum_le_0.5 == (lookup %>% select(starts_with("pred")) %>% names() %>% length())) ~ "DEF",
TRUE ~ "XYZ")) %>%
select(-starts_with("pred"), -sum_0.95, -sum_le_0.5)
이것은 오류 메시지를 제공합니다 ( lookup %>% select(starts_with("pred")) %>% names() %>% length()
case_when 의 부분 으로 인해 ).
# Error: Problem with `mutate()` input `coding`.
# x no applicable method for 'select' applied to an object of class "character"
문제는:
lookup
동일한 구조의 다른 데이터 세트로 교체 하면 작동합니다.test <- lookup
파이프 라인에서 테스트하여 조회를 교체, 그것은 작동test <- dput(lookup)
위와 동일하게 작동합니다.에 대한 검사 identical(test, lookup)
도 반환 TRUE
됩니다.
이것이 제가 실례를 제공 할 수없는 이유이기도합니다. 내가 무엇을하든 (예 : dput) 오류는 더 이상 재현 할 수 없습니다.
적어도 str(lookup)
결과 는 다음과 같습니다.
'data.frame': 5625 obs. of 30 variables:
$ id : chr "A" "B" "C" "D" ...
$ pred_QC4A_code_10 : num 1 0 0 1 1 1 1 0 1 1 ...
$ pred_QC4A_code_11 : num 0 0 0 0 0 0 0 0 0 1 ...
$ pred_QC4A_code_12 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_13 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_14 : num 0 0 0 0 0 0 0 1 0 0 ...
$ pred_QC4A_code_15 : num 0 0 1 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_16 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_17 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_20 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_21 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_22 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_23 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_30 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_31 : num 0 1 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_32 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_33 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_34 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_40 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_41 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_42 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_43 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_44 : num 0 0 0 0 1 0 0 0 0 0 ...
$ pred_QC4A_code_80 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_995 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_996 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_997 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_998 : num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_9991: num 0 0 0 0 0 0 0 0 0 0 ...
$ pred_QC4A_code_9992: num 0 0 0 0 0 0 0 0 0 0 ...
나는 그것이 정말로 select
명령 과 관련이 있다고 생각 하지만 무슨 일이 일어나고 있는지 전혀 모릅니다.
업데이트 : 문제를 해결했습니다. 문제는 내 new
데이터 프레임에라는 열이 lookup
있으므로 case_when이 외부 데이터 세트 대신이 열에 액세스하므로 당연히 작동하지 않는다는 것입니다.
고정되어 있으므로 외부에 개체를 만드는 것이 더 나을 수 있습니다.
v1 <- lookup %>%
select(starts_with("pred")) %>%
names() %>%
length()
그런 다음 단순화 할 수 있습니다.
...
coding = case_when(pred_QC4A_code_10 == 0 | pred_QC4A_code_10 == 1 ~ "ABC",
sum_0.95 > 0 & ((sum_0.95 + sum_le_0.5) == (v1))) ~ "DEF",
TRUE ~ "XYZ"))
OP는 데이터 세트에 'lookup'이라는 열이 있다고 언급했습니다. 따라서 열 대신 전역 환경의 객체를 사용해야하는 경우 이스케이프 ( !!
)
new <- old %>%
left_join(., lookup, by = "id") %>%
mutate(sum_0.95 = apply(across(starts_with("pred")), 1, function(x) {sum(x >= 0.95 & x < 1)}),
sum_le_0.5 = apply(across(starts_with("pred")), 1, function(x) {sum(x <= 0.5 & x > 0)}),
coding = case_when(pred_QC4A_code_10 == 0 | pred_QC4A_code_10 == 1 ~ "ABC",
sum_0.95 > 0 & (sum_0.95 + sum_le_0.5 == (!!lookup %>% select(starts_with("pred")) %>% names() %>% length())) ~ "DEF",
TRUE ~ "XYZ")) %>%
select(-starts_with("pred"), -sum_0.95, -sum_le_0.5)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다