Использование lapply для создания новых переменных на основе нескольких условий и подмножеств - PullRequest
0 голосов
/ 02 января 2019

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

Рассмотрим следующее:

df <- data.frame(
      cluster = c("A","B","B","A","A","B"),
      x = c(3,4,1,5,2,6),
      y = c(4,5,3,1,2,6))

Я хотел бы создать две новые переменные, называть их x.var и y.var, которые принимают отклонение от минимального значения соответствующегобазовые переменные, зависящие от кластера.Таким образом, x.var и y.var, мы надеемся, будут:

x.var y.var
-1    -3
-3    -2
 0     0
-3     0
 0    -1
-5    -3

Я безуспешно пытался использовать lapply с анонимной функцией для достижения этой цели:

vars <- lapply(df[,c(2:3)],function(x) 
    ifelse(df$cluster=="A",
    min(df[df$cluster=="A",x])-x,
    min(df[df$cluster=="B",x])-x))

Я получаю следующееошибка:

Error in `[.data.frame`(df, df$cluster == "A", x) : undefined columns selected 

Любая помощь будет высоко ценится!

Ответы [ 2 ]

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

Вот метод base R, который использует ave с lapply.Прокрутите столбцы набора данных, исключая «кластер», затем с помощью ave получите min, сгруппированный по «кластеру», вычтите из столбца и присвойте list из vector s новым столбцам

df[paste0(names(df)[-1], ".var")] <- lapply(df[-1], function(x)
                                         ave(x, df$cluster, FUN = min) - x)
df
#  cluster x y x.var y.var
#1       A 3 4    -1    -3
#2       B 4 5    -3    -2
#3       B 1 3     0     0
#4       A 5 1    -3     0
#5       A 2 2     0    -1
#6       B 6 6    -5    -3
0 голосов
/ 02 января 2019

Вот подход, использующий dplyr.

library(dplyr)

df <- data.frame(
  cluster = c("A","B","B","A","A","B"),
  x = c(3,4,1,5,2,6),
  y = c(4,5,3,1,2,6))

df %>% 
  group_by(cluster) %>% 
  mutate(x.var = min(x) - x,
         y.var = min(y) - y)

#> # A tibble: 6 x 5
#> # Groups:   cluster [2]
#>   cluster     x     y x.var y.var
#>   <fct>   <dbl> <dbl> <dbl> <dbl>
#> 1 A           3     4    -1    -3
#> 2 B           4     5    -3    -2
#> 3 B           1     3     0     0
#> 4 A           5     1    -3     0
#> 5 A           2     2     0    -1
#> 6 B           6     6    -5    -3

Создано в 2019-01-01 пакетом Представить (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...