在这里,我想删除按日期只有一个条目的条目的条目。例如,我想删除纽约和旧金山的参赛作品,因为他们在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)
答案 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)