gpt4 book ai didi

r - 过滤具有相对于其他行的特定特征的行

转载 作者:行者123 更新时间:2023-12-04 23:19:56 26 4
gpt4 key购买 nike

我有一个由两列组成的数据集:一列由名称列表组成,另一列标识相应名称所属的组(示例数据和用于复制以下示例数据的代码)。

group   name
1 aaa
1 aaa
1 aaa
2 NA
2 NA
3 NA
3 bbb
4 ccc
4 ccc
5 ddd
5 eee
6 fff
6 ffg

> x <- c(1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6)
> y <- c("aaa", "aaa", "aaa", NA, NA, NA, "bbb", "ccc", "ccc", "ddd", "eee", "fff", "ffg")
> mydataframe <- data.frame( "group" = x, "name" = y)

数据集包含超过 500,000 行(以及与此问题无关的其他列)。组可能包括可能有一个成员(一行)或多个成员(多行)。当一个组有多个成员时,成员的名字可以是: a) 相同的(例如,组 1 所有成员都被命名为“aaa”); b) 空白(例如,所有成员均为 NA 的第 2 组); c) 名称和空格的混合(例如,第 3 组包含一个空白名称和一个名称“bbb”);或 d) 不同的名称(例如,具有“ddd”和“eee”的第 5 组)。当名称不同时,它们可能非常不同(例如,第 5 组)或相似(第 6 组)

我需要过滤数据集以识别属于类别 d 的行 - 那些具有相同组号但不同(非 NA)名称的行(在下面的示例中,组 5 和 6)。

过滤器将生成一个看起来像这样的新数据集:
group   name
5 ddd
5 eee
6 fff
6 ffg

如果有人可以帮助我不仅产生上述结果,还可以区分成员名称完全不同的组(组 5)和成员名称相似但名称不同的组(组 6),则加分。

先感谢您!

最佳答案

这是一个可能的 data.table v >= 1.9.5解决方案

library(data.table)
setDT(mydataframe)[, .SD[uniqueN(na.omit(name)) == .N], by = group]
# group name
# 1: 5 ddd
# 2: 5 eee
# 3: 6 fff
# 4: 6 ffg

基本上,我们将唯一组的数量(同时删除了 NA s)与实际组大小( .N )进行比较,并将其从 .SD 中剔除。 (代表 S ub D ata)这是我们按条件划分的实际数据集。

或者使用 dplyr我们在哪里使用 n_distinctn()相反(由于某种原因,如果不首先使用 data.table 转换为 setDT(mydataframe) 对象,此解决方案似乎不起作用,所以如果您还没有这样做,请在运行此代码之前执行)
library(dplyr)
mydataframe %>%
group_by(group) %>%
filter(n_distinct(na.omit(name)) == n())

# Source: local data table [4 x 2]
# Groups: group
#
# group name
# 1 5 ddd
# 2 5 eee
# 3 6 fff
# 4 6 ffg

对于奖励积分,您也可以尝试 agrep (您可以根据需要设置 max.distance - 1 是默认值)。 1 - 表示相似, NA - 表示没有发现相似之处。
mydataframe %>%
group_by(group) %>%
filter(n_distinct(na.omit(name)) == n()) %>%
mutate(similarity = agrep(name[1L], name[-1L]))

# Source: local data table [4 x 3]
#
# group name similarity
# 1 5 ddd NA
# 2 5 eee NA
# 3 6 fff 1
# 4 6 ffg 1

关于r - 过滤具有相对于其他行的特定特征的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30014615/

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