as.formula не любит эквивалентность '=' (объект не найден) - PullRequest
0 голосов
/ 01 февраля 2012

рассмотрим следующий пример

df1 <- data.frame(a=c(1,2,3),b=c(2,4,6));
transform(df1,c=a+b)
    a b c
  1 1 2 3
  2 2 4 6
  3 3 6 9

Пока все хорошо. Теперь я хотел бы кодировать это динамически, используя as.formula:

transform(df1,as.formula("c=a+b"))

Однако R говорит

Error in eval(expr, envir, enclos) : object 'b' not found

Эта ошибка не возникает при использовании «~» в качестве разделителя левой и правой стороны. Можно ли как-то отложить оценку формулы? Можно ли вообще использовать as.formula в задании? Я пытался возиться с «с», но безрезультатно.

1 Ответ

2 голосов
/ 01 февраля 2012

Я решил проблему, которую вы упомянули в своем комментарии, так как это, кажется, ваша настоящая цель.Это позволяет избежать путаницы с формулами из исходного вопроса.

Воспроизводимая версия набора данных.

group_names <- apply(
    expand.grid("X", c("X", "O", "Y"), c("A", "B", "C"), "_", 0:9, 0:9),
    1,
    paste,
    collapse = ""
)
n_groups <- 50
n_points_per_group <- 10
df1 <- as.data.frame(matrix(
    runif(n_points_per_group * n_groups),
    ncol = n_groups
))
colnames(df1) <- sample(group_names, n_groups)

Теперь преобразуйте фрейм данных в длинный формат.(Используя пакет reshape здесь. Вы также можете использовать stats::reshape.)

melted_df1 <- melt(df1)

Определить группировку на основе ваших критериев соответствия второго символа и числа.

melted_df1$group <- with(melted_df1, paste(
    substring(variable, 2, 2),    
    substring(variable, 5, 6),
    sep = ""
))

Теперь позвоните tapply (или plyr::ddply, если хотите), чтобы получить сводную статистику.

with(melted_df1, tapply(value, group, mean))
...