gpt4 book ai didi

r - 根据多行中的值过滤 R 中的行

转载 作者:行者123 更新时间:2023-12-01 07:34:23 24 4
gpt4 key购买 nike

我正在尝试过滤掉 R 中不需要的多行数据,但我不知道该怎么做。

我使用的数据看起来有点像这样:

  Category     Item Shop1 Shop2 Shop3
1 Fruit Apples 4 6 0
2 Fruit Oranges 0 2 7
3 Veg Potatoes 0 0 0
4 Veg Onions 0 0 0
5 Veg Carrots 0 0 0
6 Dairy Yoghurt 0 0 0
7 Dairy Milk 0 1 0
8 Dairy Cheese 0 0 0

我只想保留至少一件商品对至少一家商店具有正值(value)的类别。

在这种情况下,我想删除所有 Veg 行,因为没有一家商店出售任何蔬菜。我想保留所有 Fruit 行,我想保留所有 Dairy 行,即使是所有商店中值为零的行,因为 Dairy 行之一的值确实大于 0。

我在使用 colSums 后尝试使用 group_by(Category),希望它每次都能对 Category 的内容求和,但是没有用。我还尝试在最后为 rowSums 添加一列并根据频率进行过滤,但我只能以这种方式过滤掉单个行,而不是基于整个类别的行。

虽然我可以过滤掉值为零的单个行(例如第 3 行),但我的困难在于保留第 6 行和第 8 行,其中每个商店的所有值都为零,但我想保留这些行,因为其他 Dairy 行的值确实高于零。

最佳答案

1) 子集/ave rowSums(...) > 0 每一行都有一个元素。如果该行中有非零元素,则该元素为 TRUE。它假设负值是不可能的。 (如果可能出现负值,则使用 rowSums(DF[-1:-2]^2) > 0 代替。)它还假设商店是前两列之后的那些列。特别是,它适用于任意数量的商店。然后 ave 为那些值的 any 为 TRUE 并且 subset 只保留这些值的组产生一个 TRUE。不使用任何包。

subset(DF, ave(rowSums(DF[-1:-2]) > 0, Category, FUN = any))

给予:
  Category    Item Shop1 Shop2 Shop3
1 Fruit Apples 4 6 0
2 Fruit Oranges 0 2 7
6 Dairy Yoghurt 0 0 0
7 Dairy Milk 0 1 0
8 Dairy Cheese 0 0 0

1a) 如果您不介意对商店进行硬编码,则其变体如下:
subset(DF, ave(Shop1 + Shop2 + Shop3 > 0, Category, FUN = any))

2) dplyr
library(dplyr)
DF %>% group_by(Category) %>% filter(any(Shop1, Shop2, Shop3)) %>% ungroup

给予:
# A tibble: 5 x 5
# Groups: Category [2]
Category Item Shop1 Shop2 Shop3
<fctr> <fctr> <int> <int> <int>
1 Fruit Apples 4 6 0
2 Fruit Oranges 0 2 7
3 Dairy Yoghurt 0 0 0
4 Dairy Milk 0 1 0
5 Dairy Cheese 0 0 0

3) 过滤/拆分 另一个基本解决方案是:
do.call("rbind", Filter(function(x) any(x[-1:-2]), split(DF, DF$Category)))

给予:
        Category    Item Shop1 Shop2 Shop3
Dairy.6 Dairy Yoghurt 0 0 0
Dairy.7 Dairy Milk 0 1 0
Dairy.8 Dairy Cheese 0 0 0
Fruit.1 Fruit Apples 4 6 0
Fruit.2 Fruit Oranges 0 2 7

4) dplyr/tidyr 使用 gather 将数据转换为长格式,其中每个值都有一行,然后使用 any 过滤组。最后转换回宽格式。
library(dplyr)
library(tidyr)
DF %>%
gather(shop, value, -(Category:Item)) %>%
group_by(Category) %>%
filter(any(value)) %>%
ungroup %>%
spread(shop, value)

给予:
# A tibble: 5 x 5
Category Item Shop1 Shop2 Shop3
* <fctr> <fctr> <int> <int> <int>
1 Dairy Cheese 0 0 0
2 Dairy Milk 0 1 0
3 Dairy Yoghurt 0 0 0
4 Fruit Apples 4 6 0
5 Fruit Oranges 0 2 7

注意: 可重现形式的输入是:
Lines <- "  Category     Item Shop1 Shop2 Shop3
1 Fruit Apples 4 6 0
2 Fruit Oranges 0 2 7
3 Veg Potatoes 0 0 0
4 Veg Onions 0 0 0
5 Veg Carrots 0 0 0
6 Dairy Yoghurt 0 0 0
7 Dairy Milk 0 1 0
8 Dairy Cheese 0 0 0"

DF <- read.table(text = Lines)

关于r - 根据多行中的值过滤 R 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45415970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com