Fcase 를 여러 출력

0

질문

가정은 다음과 같은 테이블:

data <- data.table(dummy=1:10)

나는 할 수 있다는 것을 알고 다음과 같은 작업을 수행합니다.

data[dummy < 5, c("test1", "test2") := list("Yes", 1)]

고:

data[, test1 := fcase(dummy < 5, "Yes")]
data[, test2 := fcase(dummy < 5, 1)]

나가려고 결합으로 이러한 하나처럼 그렇게:

data[, c("test1", "test2") := fcase(dummy < 5, list("Yes", 1))]

하지만 그것이 나에게 다음과 같은 오류가:

Error in fcase(dummy < 5, list("Yes", 1)) : 
  Length of output value #2 must either be 1 or length of logical condition.

이를 통해 여러 개의 필터를 그래서 이것을 사용하는 fcase. 난 항상 사용하여 리조트의 첫 번째 솔루션에 대한 각 필터 같이:

data[dummy < 5, c("test1", "test2") := list("Yes", 1)]
data[dummy > 7, c("test1", "test2") := list("No", 0)]
data[between(dummy, 5, 7), c("test1", "test2") := list("Maybe", NA)]

하지만 내가 궁금해가 없는 경우가 더 가능합니다. 거기에는 또한 솔루션의 테이블을 작성과 각각의 조합 test1test2 병합 이 테이블에 데이터와 테이블 일 fcase 대만 test1 그래서 다음과 같:

tests <- data.table(test1 = c("Yes", "No", "Maybe"),
                    test2 = c(1, 0, NA))

data[, test1 := fcase(dummy < 5, "Yes",
                      dummy > 7, "No",
                      between(dummy, 5, 7), NA_character_)]
merge(data, tests, by = "test1", all.x = T, sort = F)

하지만 이 것은 비효율적이 크고 복잡한 datatable

case data.table r
2021-11-17 16:48:12
1

최고의 응답

4

rbindlist:

data[, c("test1", "test2") := rbindlist(fcase(dummy < 5, .(.("Yes", 1)),
                                              dummy > 7, .(.("No", 0)),
                                              default = .(.("Maybe", NA))))]
data
#>     dummy test1 test2
#>  1:     1   Yes     1
#>  2:     2   Yes     1
#>  3:     3   Yes     1
#>  4:     4   Yes     1
#>  5:     5 Maybe    NA
#>  6:     6 Maybe    NA
#>  7:     7 Maybe    NA
#>  8:     8    No     0
#>  9:     9    No     0
#> 10:    10    No     0

do.call 당신이 당신을 넣 fcase 조건으로 목록에서 값의 또 다른 목록 중첩 목록:

data[, c("test1", "test2") := rbindlist(do.call(fcase, rbind(.(dummy < 5, dummy <= 7, dummy > 7),
                                                             .(.(.("Yes", 1)), .(.("Maybe", NA)), .(.("No", 0))))))]

tests 예제:

tests <- data.table(test1 = c("Yes", "Maybe", "No"),
                    test2 = c(1, NA, 0))
tests[, val := .(.(.(.SD))), by = 1:nrow(tests)]
data[, c("test1", "test2") := rbindlist(do.call(fcase, rbind(.(dummy < 5, dummy <= 7, dummy > 7), tests$val)))]
2021-11-22 13:23:13

안녕@jblood94,훌륭한 대답을,모두 우아하고 계몽하고 있다. 공유 주셔서 감사합니다. 환호를 받았다.
lovalery

이것은 정확히 무엇을 찾고 있었다. 감사
Wietse de Vries

안녕@jblood94,같은 맥락에서,당신은 당신이 알고 있는 경우에 넣는 방법을 또한 다른 테스트 목록에서 값과 다른 목록입니다. 내가 알고 있지만 구문을 나가 제시하고,잘못된 명확하게 뭔가를 쓰고,다음과 같다: rbindlist(fcase(.(dummy < 5, dummy > 7), .(.("Yes", 1)), .(.("No", 0))), default = .(.("Maybe", NA))))] . 사전에 감사합니다. 환호를 받았다.
lovalery

@lovalery 추가 몇 가지 예제의 라인을 따라 당신의 질문 comment.
jblood94

사@jblood94. 귀하의 예를 이끌어 나에게 물어 당신이 마지막 질문입니다! 다음과 같은 당신의 마지막 예는,나를 처리 cases 당신이 처리 tests 하지만 R 에 오류가 있습니다.: Error in (function (..., default = NA) : Argument #1 must be logical. 여기에 내가 무슨 짓을했는지: cases <- data.table(Ncases = c("dummy < 5", "dummy <= 7", "dummy > 7"))다음 cases[, val := .(.(.(. SD))), by = 1:nrow(cases)] 마지막으로 data[, c("test1", "test2") := rbindlist(do.call(fcase, rbind(.(as.list(cases$val)), as.list(tests$val))))] 사전에 감사합니다 당신의 도움이됩니다. 환호를 받았다.
lovalery

@lovalery fcase 을 받아들이지 않을 것이 문자열 when 인수를 사용합니다. 당신이 작동할 수 있는여 Ncases 벡터의 표현입니다. 이 맞지 않으로는 영업 이익의 질문에 그래서 오히려 더 혼란을 내 대답이다. 내가 만드는 것이 좋 새로운 질문을 참조하이-아마 누군가와 함께 올 것이 보다 더 좋은 방법은 내가 무슨 생각입니다.
jblood94

O.K. 당신에게 매우 감사@jblood94 수 있습니다. I'll try to explore 경로를 당신이 나에게 주면 나는 실패(는 가능성이 매우 높!), 나는 새로운 질문에 대한 링크와 함께,이 하나를 당신이 제안한다. 환호를 받았다.
lovalery

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................