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

时间:2015-07-17 04:28:42

标签: r

在这里,我想删除按日期只有一个条目的条目的条目。例如,我想删除纽约和旧金山的参赛作品,因为他们在4-11和4-12只有1次观察。

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

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)

4 个答案:

答案 0 :(得分:12)

使用您的样本数据

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

library(dplyr)
DG %>% group_by(day,City) %>% filter(n()>1)

或基础R

DG[ave(rep(1, nrow(DG)), DG$day, DG$City, FUN=length)>1,]

都返回

   day  City age
1 4-10 Miami  30
2 4-10 Miami  23

或者您可以使用data.table(由@Frank建议)

library(data.table)
setDT(DG)[,if (.N>1) .SD, by=.(City,day)]

答案 1 :(得分:4)

MrFlick的回答(像往常一样)很难达到顶峰,但这是我的较长版本,相反,它是使用dplyr进行某些练习的好方法。

这是数据框:

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,我们将城市组合在一起,然后使用summarize将分组传递到n(),这是一个方便的dplyr函数。

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转换为常规数据框,只是为了安全起见:

DG2 <- data.frame(DG1)

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

DG3 <- filter(DG2, n>1)
#City  day  n
#Miami 4-10 2

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

DG4 <- select(DG3, City, day)
#City  day
#Miami 4-10

最后,我们在原始数据框架上使用filter来获取所有多次出现的城市。这些多次出现的城市现在都在DG4(因此City==DG4$City):

DG5 <- filter(DG, City==DG4$City)
#day  City   age
#4-10 Miami  30
#4-10 Miami  23

同样,我会选择MrFlick的答案,但如果你觉得这是一个更加迂回的路线,还有更多的dplyr功能,你可能想快速看一下。

答案 2 :(得分:0)

您可以创建一个仅显示一次城市的新数据集,然后从原始数据集中删除这些城市。

library(dlypr)
city_once=count(DG,DG$City)

city_once如下所示:

date    City         age
4-11  New York       24
4-12  San Francisco  30

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

City_more=DG[!DG$City %in% city_once$City,]

City_more数据集将如下所示:

day     City   age
4-10   Miami    30
4-10   Miami    23

答案 3 :(得分:0)

我们也可以使用duplicated来避免进行任何类型的分组。

基于列的位置

DG[duplicated(DG[1:2]) | duplicated(DG[1:2], fromLast = TRUE) , ]
#   day  City age
#1 4-10 Miami  30
#2 4-10 Miami  23

根据列名进行的操作

DG[duplicated(DG[c("day", "City")]) | 
   duplicated(DG[c("day", "City")], fromLast = TRUE) ,]

数据

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), stringsAsFactors = FALSE)