2016-05-16 1 views
0

Есть ли способ вставить новые столбцы со средними значениями других существующих столбцов, начиная с определенного текста?mutate_each in dplyr: создать новый столбец со значениями средних строк других столбцов с некоторым общим текстом

К примеру, в этом наборе данных:

zz <-(" 
id 20_1 20_2 20_3 22_1 22_2 22_3  
1 .  4.00  3.50 5.80 5.35 5.15  
2 3.50 .  3.30 5.65 5.40 5.05  
3 2.80 3.40 3.80 5.30 5.25 5.30  
") 

df <- read.table(text=zz, header = TRUE) 

Я бы хотел, чтобы создать две новые колонки 20_4 и 22_4 со средним значением строки в 20_1: 20_3 и 22_1: 22_3 соответственно ...

id 20_1 20_2 20_3 20_4 22_1 22_2 22_3 22_4 
1 NA  4.00 3.50 3.75 5.80 5.35 5.15 5.43 
2 3.50 NA  3.30 3.40 5.65 5.40 5.05 5.37 
3 2.80 3.40 3.80 3.33 5.30 5.25 5.30 5.28 

Не мог бы кто-нибудь помочь мне в этом? I'm все еще учусь dplyr ...

+0

ли вы действительно '.' в ваших данных, или вы пытаетесь имитировать' NA'? –

+0

Спасибо! отредактированный вопрос .. – Juanchi

ответ

0

Другой способ сделать это будет использовать «обобщать» в dplyr создать переменные, которые вы хотите

zznew<-zz %>% 
    group_by(id)%>% 
    summarize("20_4"=mean(`20_1`:`20_3`,na.rm=TRUE),"22_4"=mean(`22_1`:`22_3`,na.rm=TRUE))%>% 
    left_join(zz,zznew,by="id") 

Edit: В ретроспективе кажется, что я неправильно в высказывании использовать «обобщать». Вот другой способ, который будет вычислять средства для каждой строки для выбранных столбцов и привязать их к dataframe:

zzz<-cbind(zz,"20_4"=rowMeans(zz[,c("20_1","20_2","20_3")],na.rm=TRUE), 
     "22_4"=rowMeans(zz[,c("22_1","22_2","22_3")],na.rm=TRUE)) 
+0

Что-то не так, потому что оно дает 20_4 = (2, 3, 2,5), когда должно быть 20_4 = (3.75, 3.4, 3.33) – Juanchi

+0

Извините, я отредактировал ответ, чтобы добавить другой метод, который должен работать – collnell

+0

это хорошее решение из dplyr ... Я думал, что это может быть легко с mutate_each(), спасибо! – Juanchi

0

Элегантное решение для этого было бы, вероятно, использовать Нестандартные Оценка:

Рассмотрим ФР, похожий на твой:

zz = data_frame(
    `20_1` = rnorm(5), 
    `20_2` = rnorm(5), 
    `20_3` = rnorm(5), 
    `22_1` = rnorm(5), 
    `22_2` = rnorm(5), 
    `22_3` = rnorm(5) 
) 
  1. Первый мы создаем вектор символа с именем столбцов, которые мы хотим усреднить вместе. Следующий код будет динамически выбирать имена всех столбцов, начиная с 20_:

    to_aggregate = names(zz)[grepl("^20", names(zz))] 
    
  2. Мы создаем формулу, которая динамически вычислять среднее:

    agg_formula = as.formula(paste0(" ~ mean(c(", paste0("`", to_aggregate, "`", collapse = ", "), "))")) 
    

    это создаст формулу: ~ среднее (с ('20_1', '20_2', '20_3'))

  3. Мы можем использовать dplyr идти по строкам и применить динамическую формулу генерироваться выше:

    zz %>% 
        mutate(tmp_ID = row_number()) %>% 
        group_by(tmp_ID) %>% 
        mutate_(.dots = setNames(list(agg_formula), 'res')) %>% 
        mutate(check_res = (`20_1` + `20_2` + `20_3`)/3) %>% 
        ungroup() 
    
+0

Это дает мне эту ошибку ... 'r Ошибка в анализе (текст = x, keep.source = FALSE): : 1: 13: неожиданный ввод 1: ~ mean (c (20_ ^ ' – Juanchi

+0

Да, вы получаете ошибку, потому что имена столбцов имеют недопустимые имена, поэтому вам нужно их обернуть с помощью \'. Я изменил agg_formula теперь, чтобы иметь «' »до и после имени строки, и теперь он будет работать –

Смежные вопросы