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

แต่ฉันสงสัยว่าถ้าไม่มีอะไรมากกว่าจะเป็นไปได้ นั่นคือทางออกขอสร้างบนโต๊ะนวนเกี่ยวกับการผสมแบบของ 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 แต่สเปนเซอร์รี้ดครับ 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

โอเคขอบคุณมาก@jblood94 สำหรับความเห็นของเธอ. ฉันจะพยายามที่จะค้นหาเส้นทางที่คุณให้ฉันและถ้าฉันล้มเหลว(ซึ่งเป็นไปได้มาก!), ฉันจะโพสใหม่คำถามกับมีการเชื่อมโยงไปยังเรื่องนี้อย่างที่คุณแนะนำว่า. เชียร์ส
lovalery

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่