Добавить новый столбец в dataframe с помощью mutate_, где имя столбца задается переменной

#r #dataframe #dplyr

#r #dataframe #dplyr

Вопрос:

У меня есть фрейм данных, в который я хочу добавить столбец, где столбец определяется именем переменной:

 df <- diamonds
NewName <- "SomeName"
df <- df %>% mutate_(paste0(NewName," = """))
 

Это дает мне следующую ошибку:

 Error: attempt to use zero-length variable name
 

Я видел множество примеров использования mutate_ для изменения имен столбцов, но не для динамического создания столбцов. Любая помощь?

Комментарии:

1. Я не получаю никакой ошибки, только столбец с именем SomeName = ""

2. выберите все строки и запустите его снова, это кажется временным

3. Действительно, во второй раз это не сработает.

4. Необходимо dplyr использовать? Что насчет df[[NewName]] <- calculation ? Вы можете использовать with , если хотите сохранить некоторые df$ ?

5. это работает, пытался решить это в dplyr и немного смущен, почему это иногда работает, а не другое. Также работает следующее (в dplyr должен быть более аккуратный способ): df <- df %>% mutate(NewName = NA) df<- df%>% rename_(.dots=setNames(«Новое имя», список (новое имя)))

Ответ №1:

Проблема связана с тем, когда происходит вычисление оператора. Насколько я понимаю, цель mutate_ состоит не в том, чтобы воссоздать синтаксис mutate , например, используя paste для создания mutate(SomeName = "") . Вместо этого это позволяет передавать генерацию функций. Причина, по которой ваш подход терпит неудачу, заключается (я полагаю) в том, что он ищет функцию с именем "" .

Вместо этого вам нужно передать функцию, которая может быть оценена (здесь я использую paste в качестве заполнителя), и задать имя этого столбца с помощью вашей переменной. Это должно сработать:

 df <- diamonds
NewName <- "SomeName"
df <- df %>% mutate_(.dots = setNames("paste('')",NewName))
 

Это также обеспечивает больший контроль, например, вы можете вставить cut и color :

 df <- df %>% mutate_(.dots = setNames("paste(cut, color)",NewName))
 

дает:

    carat       cut color clarity depth table price     x     y     z    SomeName
   <dbl>     <ord> <ord>   <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>       <chr>
1   0.23     Ideal     E     SI2  61.5    55   326  3.95  3.98  2.43     Ideal E
2   0.21   Premium     E     SI1  59.8    61   326  3.89  3.84  2.31   Premium E
3   0.23      Good     E     VS1  56.9    65   327  4.05  4.07  2.31      Good E
4   0.29   Premium     I     VS2  62.4    58   334  4.20  4.23  2.63   Premium I
5   0.31      Good     J     SI2  63.3    58   335  4.34  4.35  2.75      Good J
6   0.24 Very Good     J    VVS2  62.8    57   336  3.94  3.96  2.48 Very Good J
7   0.24 Very Good     I    VVS1  62.3    57   336  3.95  3.98  2.47 Very Good I
8   0.26 Very Good     H     SI1  61.9    55   337  4.07  4.11  2.53 Very Good H
9   0.22      Fair     E     VS2  65.1    61   337  3.87  3.78  2.49      Fair E
10  0.23 Very Good     H     VS1  59.4    61   338  4.00  4.05  2.39 Very Good H
 

(Следует отметить, что я также получил начальный синтаксис для работы в первый раз, за которым последовали последующие сбои. Стоит углубиться.)