การรวมแถวตามค่าคอลัมน์ที่ตรงกันใน R? [ซ้ำ]
Aug 16 2020
c1 c2 count
1 1 1 20
2 2 3 50
3 1 4 30
ดังนั้นฉันจึงมีข้อมูลเหมือนตารางด้านบนเป็นหลัก แต่สิ่งที่ฉันต้องการทำคือเพิ่มคอลัมน์ใหม่ที่มีการนับของแต่ละแถวหารด้วยผลรวมของจำนวนแถวทั้งหมดที่มีค่า c1 เท่ากันโดยลงท้ายด้วย:
c1 c2 count new_col
1 1 1 20 20/50
2 2 3 40 40/40
3 1 4 30 30/50
ดังที่คุณเห็นคอลัมน์ใหม่มีจำนวนแถวหารด้วยผลรวมของจำนวนทั้งหมดที่มีค่า c1 ที่ตรงกัน สิ่งที่ฉันพยายามมีดังนี้:
df$new_col <- df$count/sum(df[SUBSET OF ROWS THAT HAVE SAME c1 VALUE]$count)
ฉันเคยเห็นบางอย่างเช่น df [df $ c1 == บางค่า] แต่จะใช้ได้ผลเหมือนกับค่าฮาร์ดโค้ดเท่านั้น ฉันสามารถลองใช้ for loop ได้ แต่มันใช้เวลานานเกินไปในการวนซ้ำทุกแถวในข้อมูลของฉันและไม่เคยทำงานจนเสร็จฉันก็ไม่รู้ค่าทั้งหมดที่ c1 ใช้ ฉันค่อนข้างใหม่สำหรับ R และอาจมีวิธีง่ายๆในการแก้ปัญหานี้ แต่ฉันยังไม่สามารถคิดได้
คำตอบ
3 Duck Aug 16 2020 at 04:06
ลองสิ่งนี้:
library(dplyr)
#Data
df <- structure(list(c1 = c(1L, 2L, 1L), c2 = c(1L, 3L, 4L), count = c(20,
40, 30)), row.names = c("1", "2", "3"), class = "data.frame")
รหัส:
df %>% group_by(c1) %>% mutate(Sum=sum(count),NewVar=count/Sum)
เอาท์พุต:
# A tibble: 3 x 5
# Groups: c1 [2]
c1 c2 count Sum NewVar
<int> <int> <dbl> <dbl> <dbl>
1 1 1 20 50 0.4
2 2 3 40 40 1
3 1 4 30 50 0.6
2 ThomasIsCoding Aug 16 2020 at 04:20
ตัวเลือก R พื้นฐานผ่าน ave
> within(df,new_col <- count/ave(count,c1,FUN = sum))
c1 c2 count new_col
1 1 1 20 0.4
2 2 3 40 1.0
3 1 4 30 0.6
หรือทางrowsum
(โดย @akrun จากความคิดเห็น)
> within(df,new_col <- count/rowsum(count,c1)[c1])
c1 c2 count new_col
1 1 1 20 0.4
2 2 3 40 1.0
3 1 4 30 0.6
ข้อมูล
> dput(df)
structure(list(c1 = c(1L, 2L, 1L), c2 = c(1L, 3L, 4L), count = c(20,
40, 30)), row.names = c("1", "2", "3"), class = "data.frame")