แยกทุกองค์ประกอบที่ n ของเวกเตอร์


127

ฉันต้องการสร้างเวกเตอร์ซึ่งแต่ละองค์ประกอบเป็นi+6thองค์ประกอบของเวกเตอร์อื่น

ตัวอย่างเช่นในเวกเตอร์ที่มีความยาว 120 ฉันต้องการสร้างเวกเตอร์อื่นที่มีความยาว 20 ซึ่งแต่ละองค์ประกอบเป็นค่าi, i+6, i+12, i+18...ของเวกเตอร์เริ่มต้นนั่นคือฉันต้องการแยกทุกองค์ประกอบที่ 6 ของต้นฉบับ

คำตอบ:


161
a <- 1:120
b <- a[seq(1, length(a), 6)]

9
ควรใช้ seq.int (1L, length (a), 6L) เป็นอย่างน้อยสำหรับเวกเตอร์ที่ยาว
Wojciech Sobala

1
@WojciechSobala คุณช่วยแสดงความคิดเห็นได้ไหมว่าทำไมมันดีกว่า?
dpel

1
@DavidPell seq.intเร็วกว่าใน microbenchmarks แต่ฉันสงสัยว่าการเพิ่มประสิทธิภาพใด ๆ ในโปรแกรมจริงจะถูกแคระแกร็นตามเวลาการทำงานของส่วนอื่น ๆ
Sean1708

ฉันเกลียดการเปรียบเทียบ Python กับ R แต่ PyRon จะยอดเยี่ยมแค่ไหน? a = 1:120; b = [::6]. Python ไม่สามารถทำอดีต R ไม่ใช่ตัวหลัง
bers

44

เคล็ดลับอีกประการหนึ่งในการหาชิ้นส่วนตามลำดับ (นอกเหนือจากโซลูชัน seq ที่กล่าวไปแล้ว) คือการใช้เวกเตอร์ลอจิกสั้น ๆ และใช้การรีไซเคิลเวกเตอร์:

foo[ c( rep(FALSE, 5), TRUE ) ]

2
ข้อดีของวิธีนี้คือสามารถใช้ชั่วคราวได้ ในการใช้งานseqคุณต้องสามารถเรียกlengthเวกเตอร์ได้ letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers

27

ฉันคิดว่าคุณกำลังถามสองสิ่งที่ไม่จำเป็นต้องเหมือนกัน

ฉันต้องการแยกทุกองค์ประกอบที่ 6 ของต้นฉบับ

คุณสามารถทำได้โดยการสร้างดัชนีลำดับ:

foo <- 1:120
foo[1:20*6]

ฉันต้องการสร้างเวกเตอร์ซึ่งแต่ละองค์ประกอบเป็นองค์ประกอบ i + 6th ของเวกเตอร์อื่น

วิธีง่ายๆในการทำเช่นนี้คือการเสริมปัจจัยเชิงตรรกะด้วย FALSEs จนถึงi+6:

foo <- 1:120
i <- 1
foo[1:(i+6)==(i+6)]
[1]   7  14  21  28  35  42  49  56  63  70  77  84  91  98 105 112 119

i <- 10
foo[1:(i+6)==(i+6)]
[1]  16  32  48  64  80  96 112

เนียนมาก! ฉันใช้มันในทิศทางอื่นfoo[1:(i+6)!=(i+6)]เช่นกันคือส่งออกค่าทั้งหมดยกเว้นค่าที่หก
Fredrik Erlandsson

1

เพื่อเลือกทุกองค์ประกอบที่ n จากตำแหน่งเริ่มต้นใด ๆในเวกเตอร์

nth_element <- function(vector, starting_position, n) { 
  vector[seq(starting_position, length(vector), n)] 
  }

# E.g.
vec <- 1:12

nth_element(vec, 1, 3)
# [1]  1  4  7 10

nth_element(vec, 2, 3)
# [1]  2  5  8 11
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.