我正在尝试创建一个新变量的列表,这些变量表示基于另一个变量子集的变量最小值的偏差。
请考虑以下内容:
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
任何帮助将不胜感激!
答案 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