В R можно ли обновить столбец, а также создать новый за один проход? - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь узнать, могу ли я обновить R фрейм данных, обновив одно поле и создав другое поле, итого два поля, всего за один проход / строку.

Я попробовал следующее:field1 - это поле для обновления, которое уже существует, а field2 - это поле, которое будет создано заново.

df[field1, field2] <- cbind(" added text", "newfield")

Но поскольку field2 не существует, я получаю сообщение об ошибке: object 'field2' not found.

Я знаю, что, очевидно, назначил его вручную в два этапа с помощью следующего, но я хочу избежать спагетти-кода, так как я должен повторить довольно много полей:

df$field1[df$field1 == "Original"] <- "Original added text"
df$field2 <- "newfield"

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вот решение, использующее purr:

sample_df<-iris
sample_df$Species<- NULL

library(purrr)

walk2(.x = list(Species=iris$Species,
          Sepal.Length=sample_df$Sepal.Length*100),
      .y = c("Species", "Sepal.Length"),
      function(x,y) {sample_df[y]<<-x})

sample_df

Логика здесь заключается в том, чтобы передавать содержимое переменных и имена переменных как отдельные аргументы, которые объединяются, используя один в качестве ссылки, а другой в качестве содержимого.

Если вы делаете это периодически в своем коде, я бы предложил использовать mutate из пакета dplyr.

0 голосов
/ 18 января 2019

Вот один вариант, используя data.table. Попробуйте:

df <- iris
df$Species <- as.character(df$Species)
# let's say that Species is the field to update and already exists,  
# while Species2 is the field that would be newly created
library(data.table)
setDT(df)[Species == "setosa",
          c("Species", "Species2") := list("Original added text",
                                           "Species2")][]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...