【发布时间】:2015-10-19 09:51:56
【问题描述】:
我正在尝试获取具有不同组的数据框,并找出哪些组共享一个共同值或 一组值。
例如,假设我有一些装有不同水果的水果篮,我想找出哪些篮子里有特定的水果。
这是我的水果篮:
fruit_baskets <- data.frame(basket=c(rep("blue",3),rep("red",3),rep("green",3)),
fruits=c("orange", "tomato", "pear",
"orange", "tomato", "grape",
"strawberry", "tomato", "grape"))
# > print(fruit_baskets)
# basket fruits
# 1 blue orange
# 2 blue tomato
# 3 blue pear
# 4 red orange
# 5 red tomato
# 6 red grape
# 7 green strawberry
# 8 green tomato
# 9 green grape
还有我的函数来查找哪些篮子包含特定的水果:
find_similar_baskets_1 <- function(some_baskets, fruit) {
some_baskets %>%
group_by(basket) %>%
summarise(xxx_1=max(ifelse(fruits==fruit, 1, 0))) %>%
filter(xxx_1 == 1) %>%
.[[1]] %>% unique %>% as.character
}
我可以使用这个功能找到装番茄的篮子。
> find_similar_baskets_1(fruit_baskets, "tomato")
[1] "blue" "green" "red"
同样,我可以创建一个函数来查找哪些篮子都有两个水果。
find_similar_baskets_2 <- function(some_baskets, fruit_1, fruit_2) {
some_baskets %>%
group_by(basket) %>%
summarise(xxx_1=max(ifelse(fruits==fruit_1, 1, 0)),
xxx_2=max(ifelse(fruits==fruit_2, 1, 0))) %>%
filter(xxx_1 == 1 & xxx_2 == 1) %>%
.[[1]] %>% unique %>% as.character
}
现在我可以使用这个函数来找出哪些篮子里有橙子和番茄(蓝色和红色的),哪些篮子里有番茄和葡萄(绿色和红色的)。
find_similar_baskets_2(fruit_baskets, "orange", "tomato")
#[1] "blue" "red"
find_similar_baskets_2(fruit_baskets, "tomato", "grape")
#[1] "green" "red"
在理想的世界中,我可以创建一个不依赖于我给它的值(即水果)数量的函数。
find_similar_groups <- function(df, group_column, value_column, value_vector)
我可以有一个任意大的值向量,而组列(在本例中为“篮子”)和值列(“水果”)不在函数中。
df = fruit_baskets
column = "fruits"
values = c("tomato") or c("orange", "tomato")
【问题讨论】:
-
关于
max或ifelse,您想使用any,例如fruit_baskets %>% group_by(basket) %>% filter(any(fruits=='tomato')) %>% .$basket %>% unique %>% as.character