在嵌套数据框中变异
Mutate within nested data frame
我想在组内执行 kmeans
并在我的数据中添加关于集群编号和中心的数据信息,观察被分配到(仍然,在组内,因此集群 1 与组 A 和B组)。我认为我可以 pluck
从 kmeans
聚类分配和质心,然后可能将这两者相互连接,最后与原始数据连接。要执行前者,我想向具有中心的数据帧添加行号,然后按簇数加入。但是如何在嵌套数据框中添加行号呢?下面的代码直到最后都运行良好,'nested' mutate
.
my_data <- data.frame(group = c(sample(c('A', 'B', 'C'), 20, replace = TRUE)), x = runif(100, 0, 10), y = runif(100, 0, 10))
my_data %>%
group_by(group) %>%
nest() %>%
mutate(km_cluster = map(data, ~kmeans(.x, 3) %>% pluck('cluster')),
km_centers = map(data, ~kmeans(.x, 3) %>% pluck('centers') %>% mutate(cluster = row_number())))
@Luke.sonnet 提供了一个适用于 map
的答案,但有趣的是不适用于 map2
,见下文:
my_data %>%
group_by(group) %>%
nest() %>%
mutate(number = sample(3:7, 3)) %>%
mutate(km_cluster = map2(data, number, ~kmeans(.x, .y) %>% pluck('cluster')),
km_centers = map2(data, number, ~kmeans(.x, .y) %>% pluck('centers') %>% as_tibble() %>% mutate(cluster = row_number())))
有什么想法可以解决那种情况下的问题吗?同样重要的是,这种行为的原因是什么?
问题是 pluck()
正在返回一个矩阵。先投到一个 tibble,然后编号不同。
library(tidyverse)
my_data <- data.frame(group = c(sample(c('A', 'B', 'C'), 20, replace = TRUE)), x = runif(100, 0, 10), y = runif(100, 0, 10))
my_data %>%
group_by(group) %>%
nest() %>%
mutate(number = sample(3:7, 3)) %>%
mutate(km_cluster = map2(data, number, ~kmeans(.x, .y) %>% pluck('cluster')),
km_centers = map2(data, number, ~kmeans(.x, .y) %>% pluck('centers') %>% as_tibble() %>% mutate(cluster = seq_len(nrow(.)))))
请注意,您也可以执行 mutate(cluster = row_number(x))))
,这会提供不同的数字(请注意,仅使用 row_number()
会使用来自父 df 的行)。我认为给定 kmeans
中心矩阵按簇号按行排序,主块中的答案是正确的。
我想在组内执行 kmeans
并在我的数据中添加关于集群编号和中心的数据信息,观察被分配到(仍然,在组内,因此集群 1 与组 A 和B组)。我认为我可以 pluck
从 kmeans
聚类分配和质心,然后可能将这两者相互连接,最后与原始数据连接。要执行前者,我想向具有中心的数据帧添加行号,然后按簇数加入。但是如何在嵌套数据框中添加行号呢?下面的代码直到最后都运行良好,'nested' mutate
.
my_data <- data.frame(group = c(sample(c('A', 'B', 'C'), 20, replace = TRUE)), x = runif(100, 0, 10), y = runif(100, 0, 10))
my_data %>%
group_by(group) %>%
nest() %>%
mutate(km_cluster = map(data, ~kmeans(.x, 3) %>% pluck('cluster')),
km_centers = map(data, ~kmeans(.x, 3) %>% pluck('centers') %>% mutate(cluster = row_number())))
@Luke.sonnet 提供了一个适用于 map
的答案,但有趣的是不适用于 map2
,见下文:
my_data %>%
group_by(group) %>%
nest() %>%
mutate(number = sample(3:7, 3)) %>%
mutate(km_cluster = map2(data, number, ~kmeans(.x, .y) %>% pluck('cluster')),
km_centers = map2(data, number, ~kmeans(.x, .y) %>% pluck('centers') %>% as_tibble() %>% mutate(cluster = row_number())))
有什么想法可以解决那种情况下的问题吗?同样重要的是,这种行为的原因是什么?
问题是 pluck()
正在返回一个矩阵。先投到一个 tibble,然后编号不同。
library(tidyverse)
my_data <- data.frame(group = c(sample(c('A', 'B', 'C'), 20, replace = TRUE)), x = runif(100, 0, 10), y = runif(100, 0, 10))
my_data %>%
group_by(group) %>%
nest() %>%
mutate(number = sample(3:7, 3)) %>%
mutate(km_cluster = map2(data, number, ~kmeans(.x, .y) %>% pluck('cluster')),
km_centers = map2(data, number, ~kmeans(.x, .y) %>% pluck('centers') %>% as_tibble() %>% mutate(cluster = seq_len(nrow(.)))))
请注意,您也可以执行 mutate(cluster = row_number(x))))
,这会提供不同的数字(请注意,仅使用 row_number()
会使用来自父 df 的行)。我认为给定 kmeans
中心矩阵按簇号按行排序,主块中的答案是正确的。