使用lapply根据多个条件和子集创建新变量

时间:2019-01-02 00:16:39

标签: r list apply lapply

我正在尝试创建一个新变量的列表,这些变量表示基于另一个变量子集的变量最小值的偏差。

请考虑以下内容:

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 :(得分:1)

这是使用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

reprex package(v0.2.1)于2019-01-01创建

答案 1 :(得分:0)

这是一个base R方法,它与ave一起使用lapply。遍历数据集的除“群集”之外的列,然后使用ave得到按“群集”分组的{​​{1}},从列中减去并分配min的{​​{1}}到新列

list