ฉันสามารถสร้างหลายคอลัมน์จากกลุ่มเดียวโดยการกลายพันธุ์ได้หรือไม่

ฉันต้องการจัดกลุ่ม dataframe ของฉันในคอลัมน์ใดคอลัมน์หนึ่ง จากนั้นใช้ฟังก์ชันกับข้อมูลที่จัดกลุ่มซึ่งส่งคืนหลายคอลัมน์ โดยยกตัวอย่าง ให้พิจารณาสิ่งต่อไปนี้

Names = append(rep('Mark',10),rep('Joe',10))
Spend = rnorm(length(Names),50,0.5)

df <- data.frame(
  Names,
  Spend
)


get.mm <- function(data){


  return(list(median(data),mean(data)))
}

ที่นี่ get.mm ส่งคืนรายการตัวเลขสองตัว ฉันต้องการใช้ get.mm กับ df %>% group_by(Names) และให้ผลลัพธ์มีสองคอลัมน์ หนึ่งคอลัมน์สำหรับแต่ละเอาต์พุตของฟังก์ชัน

ผลลัพธ์ที่ต้องการควรเป็น

  Names   median    mean
  <fctr>    <dbl>   <dbl>
1    Joe 49.89284 49.9504
2   Mark 50.17244 50.0735

ผมจัดฟังก์ชันตรงนี้ให้เรียบง่ายเพื่อใช้สาธิต ผมรู้ว่าผมทำแบบนั้นได้

df %>% group_by(Names) %>% summarise(median = median(Spend), mean = mean(Spend))

person Demetri Pananos    schedule 28.07.2017    source แหล่งที่มา
comment
ดู summarise_at() และ cran.r-project.org/web/packages /dplyr/บทความสั้น/   -  person Alex P    schedule 28.07.2017
comment
โพสต์ในบล็อกนี้มีความเกี่ยวข้องมาก: r-bloggers.com/ การเขียนโปรแกรมด้วย-dplyr-โดยใช้-dplyr   -  person Alex P    schedule 28.07.2017


คำตอบ (1)


หากคุณเขียน get.mm ใหม่เพื่อให้ส่งคืน data frame คุณสามารถใช้ group_by %>% do:

get.mm <- function(data){
    data.frame(median = median(data), mean = mean(data))
}

df %>% group_by(Names) %>% do(get.mm(.$Spend))  
# here . stands for a sub data frame with a unique Name, .$Spend passes the corresponding
# column to the function

ตัวอย่างที่ทำซ้ำได้:

set.seed(1)
Names = append(rep('Mark',10),rep('Joe',10))
Spend = rnorm(length(Names),50,0.5)
df <- data.frame(Names, Spend)

df %>% group_by(Names) %>% do(get.mm(.$Spend))

# A tibble: 2 x 3
# Groups:   Names [2]
#   Names   median     mean
#  <fctr>    <dbl>    <dbl>
#1    Joe 50.24594 50.12442
#2   Mark 50.12829 50.06610

df %>% group_by(Names) %>% summarise(median = median(Spend), mean = mean(Spend))

# A tibble: 2 x 3
#   Names   median     mean
#  <fctr>    <dbl>    <dbl>
#1    Joe 50.24594 50.12442
#2   Mark 50.12829 50.06610
person Psidom    schedule 28.07.2017
comment
ฉันไม่ใช่คน dplyr-er บ่อยนัก แต่เป็นสิ่งที่ df %>% group_by(Names) %>% summarise_all(funs(mean,median)) ยอมรับได้หรือไม่ - person thelatemail; 28.07.2017
comment
@thelatemail ใช้งานได้จริงและเป็นตัวเลือกที่ยอดเยี่ยมที่นี่ group_by %>% do เหมาะสำหรับกรณีและปัญหาที่ซับซ้อนมากขึ้นตามที่ระบุโดย OP - person Psidom; 28.07.2017