Fcase करने के लिए कई outputs

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)]

लेकिन मैं सोच रहा हूँ अगर वहाँ कुछ नहीं है और अधिक संभव है. वहाँ भी समाधान की एक तालिका बनाने के साथ प्रत्येक संयोजन के test1 और test2 और इस मर्ज के साथ तालिका डेटा तालिका करने के बाद एक 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 मैं एक उदाहरण की तर्ज पर अपने प्रश्न-टिप्पणी की है ।
jblood94

बहुत बहुत धन्यवाद @jblood94. अपने उदाहरण का नेतृत्व पूछने के लिए मुझे आप एक अंतिम प्रश्न! निम्नलिखित अपने पिछले उदाहरण में, मैं करने की कोशिश की संभाल करने के लिए cases के रूप में आप को संभाला tests लेकिन आर निम्न त्रुटि संदेश देता है: 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 अपनी टिप्पणी के लिए. मैं कोशिश करता हूँ पता लगाने के लिए पथ आप मुझे दे और अगर मैं असफल हो (जो बहुत संभावना है!), मैं पोस्ट करेंगे एक नया सवाल के साथ एक लिंक करने के लिए इस एक के रूप में, आप का सुझाव है. चियर्स.
lovalery

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में