从caseid和year中删除数据框中的特定行

时间:2017-04-05 08:45:49

标签: r dataframe conditional

我是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没有缺少年份的另一行。

我希望你们能理解我在寻找的东西:(

提前谢谢你!

5 个答案:

答案 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)