首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除组中只有一个观察的条目

删除组中只有一个观察的条目
EN

Stack Overflow用户
提问于 2015-07-17 04:28:42
回答 4查看 4.5K关注 0票数 7

在这里,我想删除的条目,只有一个条目,一个给定的城市日期。举个例子,我想删除纽约和旧金山的条目,因为它们只有一个关于4-11和4-12的观测结果。

代码语言:javascript
运行
复制
day                          City                  age
4-10                        Miami                   30
4-10                        Miami                   23
4-11                        New York                24
4-12                        San Francisco           30

注数据集称为DG。

我尝试使用for循环来查找天数,并了解每个除法每天的条目数,但我不知道如何处理R.Countx =0中的数组。

代码语言:javascript
运行
复制
D = unique(DG$day)
for (i in 1:length(D))
{
    for (j in 1:length(DG$age))
    {
      if (DG$day[j] == D{i]
      {
      countx[j] = 1
      }
      else
      {
      countx[j] = 0
      }
    }
Binded <- cbind(countx, DG)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-17 04:34:18

用你的样本数据

代码语言:javascript
运行
复制
DG <- read.csv(text="day,City,age
4-10,Miami,30
4-10,Miami,23
4-11,New York,24
4-12,San Francisco,30")

你可以用dplyr

代码语言:javascript
运行
复制
library(dplyr)
DG %>% group_by(day,City) %>% filter(n()>1)

或基R

代码语言:javascript
运行
复制
DG[ave(rep(1, nrow(DG)), DG$day, DG$City, FUN=length)>1,]

都回来了

代码语言:javascript
运行
复制
   day  City age
1 4-10 Miami  30
2 4-10 Miami  23

或者您可以使用data.table (如@Frank建议的那样)

代码语言:javascript
运行
复制
library(data.table)
setDT(DG)[,if (.N>1) .SD, by=.(City,day)]
票数 18
EN

Stack Overflow用户

发布于 2015-07-17 05:05:05

MrFlick先生的回答(和往常一样)很难超越,但是这里是我的更长的版本,相反,它是一种很好的方法,可以在dplyr上进行一些实践。

这是数据文件:

代码语言:javascript
运行
复制
DG <- data.frame(day=c('4-10', 4-10', '4-11', '4-12'), City=c('Miami', 'Miami', 'New York', 'San Francisco'), age=c(30, 23, 23, 30))

使用group_by,我们将城市分组在一起,然后使用n()将这些分组排入summarize,这是一个方便的dplyr函数。

代码语言:javascript
运行
复制
DG1 <- DG %>%
  group_by(City, day) %>%
  summarize(n=n())
#          City  day n
#         Miami 4-10 2
#      New York 4-11 1
# San Francisco 4-12 1

为了安全起见,将DG1转换为常规数据格式:

代码语言:javascript
运行
复制
DG2 <- data.frame(DG1)

然后,根据不止一次出现的内容,...and通过filter消除不需要的行。

代码语言:javascript
运行
复制
DG3 <- filter(DG2, n>1)
#City  day  n
#Miami 4-10 2

接下来,使用select获取列(而我们只是使用filter获取行)。这只会去掉列n

代码语言:javascript
运行
复制
DG4 <- select(DG3, City, day)
#City  day
#Miami 4-10

最后,我们在原始数据上使用filter来获取所有发生多次事件的城市。这些发生多次的城市现在生活在DG4 (因此City==DG4$City)中:

代码语言:javascript
运行
复制
DG5 <- filter(DG, City==DG4$City)
#day  City   age
#4-10 Miami  30
#4-10 Miami  23

同样,我也会使用MrFlick先生的答案,但是如果您觉得自己是一条更迂回的路线,需要更多的dplyr函数,那么您可能需要快速查看一下。

票数 4
EN

Stack Overflow用户

发布于 2018-09-21 11:55:03

您可以使用只出现一次的城市创建新的数据集,然后从原始数据集中删除这些城市。

代码语言:javascript
运行
复制
library(dlypr)
city_once=count(DG,DG$City)

city_once将如下所示:

代码语言:javascript
运行
复制
date    City         age
4-11  New York       24
4-12  San Francisco  30

然后从原始数据集中删除这些城市DG:

代码语言:javascript
运行
复制
City_more=DG[!DG$City %in% city_once$City,]

City_more数据集将如下所示:

代码语言:javascript
运行
复制
day     City   age
4-10   Miami    30
4-10   Miami    23
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31468401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档