gpt4 book ai didi

删除 data.frame 中包含其他列的行

转载 作者:行者123 更新时间:2023-12-04 10:45:05 24 4
gpt4 key购买 nike

我正在尝试在 data.frame 中实现类似于 unique 的东西,其中 column 中一行中的每个元素都是向量。我想要做的是,如果该帽子行的列中的向量元素是一个子集或等于另一个子集,则删除元素数量较少的行。我可以使用嵌套的 for 循环来实现这一点,但由于数据包含 400,000 行,因此程序效率非常低。

示例数据

# Set the seed for reproducibility 
set.seed(42)

# Create a random data frame
mydf <- data.frame(items = rep(letters[1:4], length.out = 20),
grps = sample(1:5, 20, replace = TRUE),
supergrp = sample(LETTERS[1:4], replace = TRUE))


# Aggregate items into a single column
temp <- aggregate(items ~ grps + supergrp, mydf, unique)

# Arrange by number of items for each grp and supergroup
indx <- order(lengths(temp$items), decreasing = T)
temp <- temp[indx, ,drop=FALSE]

温度看起来像

       grps supergrp   items
1 4 D a, c, d
2 3 D c, d
3 5 D a, d
4 1 A b
5 2 A b
6 3 A b
7 4 A b
8 5 A b
9 1 D d
10 2 D c

现在您可以看到第二行和第三行中的 supergrp 和项目的第二个组合包含在第一行中。所以,我想从结果中删除第二行和第三行。同样,第4行包含第5行到第8行。最后第9行和第10行包含在第1行中,所以我想删除第9行和第10行。因此,我的结果如下所示:

      grps supergrp   items
1 4 D a, c, d
4 1 A b

我的实现如下::

# initialise the result dataframe by first row of old data frame
newdf <-temp[1, ]

# For all rows in the the original data
for(i in 1:nrow(temp))
{
# Index to check if all the items are found
indx <- TRUE

# Check if item in the original data appears in the new data
for(j in 1:nrow(newdf))
{
if(all(c(temp$supergrp[[i]], temp$items[[i]]) %in%
c(newdf$supergrp[[j]], newdf$items[[j]]))){
# set indx to false if a row with same items and supergroup
# as the old data is found in the new data
indx <- FALSE
}
}

# If none of the rows in new data contain items and supergroup in old data append that
if(indx){
newdf <- rbind(newdf, temp[i, ])
}
}

我相信有一种有效的方法可以在 R 中实现它;可能正在使用 tidy 框架和 dplyr 链,但我错过了诀窍。为一个较长的问题道歉。任何输入将不胜感激。

最佳答案

我会尝试从列表列中取出项目并将它们存储在更长的数据框中。这是我有点老套的解决方案:

library(stringr)

items <- temp$items %>%
map(~str_split(., ",")) %>%
map_df(~data.frame(.))

out <- bind_cols(temp[, c("grps", "supergrp")], items)

out %>%
gather(item_name, item, -grps, -supergrp) %>%
select(-item_name, -grps) %>%
unique() %>%
filter(!is.na(item))

关于删除 data.frame 中包含其他列的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45449938/

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