我是R的初学者,所以请保持温柔:)
我有以下格式的数据框:
sampleData <- data.frame(id = c(1,1,2,2,3,4,4),
year = c(2010, 2014, 2010, 2014, 2010, 2010, 2014))
sampleData
id year
1 1 2010
2 1 2014
3 2 2010
4 2 2014
5 3 2010
6 4 2010
7 4 2014
我想排除每个没有两年的ID。
在这种情况下:id&#34; 3&#34;只有一年&#34; 2010&#34;。
因此,我想有条件地删除id,这些id没有缺少年份的另一行。
我希望你们能理解我在寻找的东西:(
提前谢谢你!
答案 0 :(得分:2)
我们可以使用ave
并检查每个id
的行数,并仅选择length
为2的行。
sampleData[ave(sampleData$year, sampleData$id, FUN = length) == 2, ]
# id year
#1 1 2010
#2 1 2014
#3 2 2010
#4 2 2014
#6 4 2010
#7 4 2014
如果我们想检查两者是否&#34; 2010&#34;和&#34; 2014&#34;每个id我们至少出现一次
sampleData[as.logical(ave(sampleData$year, sampleData$id, FUN = function(x)
any(2014 %in% x) & any(2010 %in% x))), ]
答案 1 :(得分:2)
sampleData <- data.frame(id = c(1,1,2,2,3,4,4),
year = c(2010, 2014, 2010, 2014, 2010, 2010, 2014))
首先你算一下:
library(plyr)
countBy <- ddply(unique(sampleData),
.(id),
summarise,
occurence = length(year) ,
.parallel = F )
然后你分组
sampleData[sampleData$id %in% countBy$id[countBy$occurence > 1],]
答案 2 :(得分:1)
以下是data.table
library("data.table")
sampleData <- data.frame(id = c(1,1,2,2,3,4,4), year = c(2010, 2014, 2010, 2014, 2010, 2010, 2014))
setDT(sampleData)
sampleData[, `:=`(n, .N), by=id][n==2]
答案 3 :(得分:1)
如果你想让你的支票更明确,即不仅仅依赖于每个id两行但是检查“2010”和“2014”是否每个id至少出现一次,你可以在base R中做这样的事情:
x <- table(sampleData$id, sampleData$year) > 0
x
# 2010 2014
# 1 TRUE TRUE
# 2 TRUE TRUE
# 3 TRUE FALSE
# 4 TRUE TRUE
ids_to_keep <- row.names(x)[rowSums(x[,c("2010", "2014")]) == 2]
ids_to_keep
#[1] "1" "2" "4"
sampleData[sampleData$id %in% ids_to_keep,]
# id year
#1 1 2010
#2 1 2014
#3 2 2010
#4 2 2014
#6 4 2010
#7 4 2014
这种方法比其他方法更长,但它也更强大,例如,如果你可以在同一年内发生同一年的多次出现,那么其他一些方法可能会失败,或者如果你可以有其他年份(不仅仅是2010年和2014年) )如果他们只依赖于检查每个id的出现次数,其他一些方法也可能失败。
答案 4 :(得分:1)
还有一个很好的dplyr解决方案:
# create the sample dataset
sampleData <- data.frame(id = c(1,1,2,2,3,4,4),
year = c(2010, 2014, 2010, 2014, 2010, 2010, 2014))
# load dplyr library
library(dplyr)
# take the sample dateset
sampleData %>%
# group by id - thus the function within filter will be evaluated for each id
group_by(id) %>%
# filter only ids which were recorded in two separate years
filter(length(unique(year)) == 2)