gpt4 book ai didi

r - 按条件子集数据

转载 作者:行者123 更新时间:2023-12-02 22:43:46 25 4
gpt4 key购买 nike

我正在尝试 reshape /减少我的数据。到目前为止,我使用了一个 for 循环(非常慢),但据我所知,使用 Plyr 应该很快。

我有很多组(公司,作为数据集中的一个因素),我想完全删除在该公司的任何单元格中为 value 显示 0 条目的每个公司。因此,我创建了一个新的 data.frame,但在某些时候省略了所有显示 value 为 0 的组。

for循环:

Data Creation:

set.seed(1)
mydf <- data.frame(firmname = sample(LETTERS[1:5], 40, replace = TRUE),
value = rpois(40, 2))

-----------------------------
splitby = mydf$firmname


new.data <- data.frame()

for (i in 1:(length(unique(splitby)))) {
temp <- subset(mydf, splitby == as.character(paste(unique(splitby)[i])))
if (all(temp$value > 0) == "TRUE") {
new.data <- rbind(new.data, temp)
}
}

Delete all empty firm factors
new.data$splitby <- factor(new.data$splitby)

有没有办法用 plyr 包来实现? subset 函数可以在该上下文中使用吗?

编辑:为了重现问题,添加了 BenBarnes 建议的数据创建。本,非常感谢。此外,我的代码已更改以符合下面提供的答案。

最佳答案

您可以为 ddply() 中的 .fun 参数提供一个匿名函数:

set.seed(1)

mydf <- data.frame(firmname = sample(LETTERS[1:5], 40, replace = TRUE),
value = rpois(40, 2))

library(plyr)

ddply(mydf,.(firmname), function(x) if(any(x$value==0)) NULL else x )

或者按照 Andrie 的建议使用 [:

firms0 <- unique(mydf$firmname[which(mydf$value == 0)])

mydf[-which(mydf$firmname %in% firms0), ]

注意ddply的结果是按照firmname排序的

编辑

对于您评论中的示例,这种方法再次比使用 ddply() 进行子集化更快,只选择具有三个以上条目的公司:

firmTable <- table(mydf$firmname)

firmsGT3 <- names(firmTable)[firmTable > 3]

mydf[mydf$firmname %in% firmsGT3, ]

关于r - 按条件子集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10348225/

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