基于两个因子水平删除行(Remove row based on two factor levels)

2019-10-19 05:26发布

我有一个问题,这是非常类似于这样的问题 ,但是我的数据是由两个层次进行分组。

str(dt)
'data.frame':   202206 obs. of  4 variables:
$ cros : int  -205 -200 -195 -190 -185 -180 -175 -170 -165 -160 ...
$ along: Factor w/ 113 levels "100","101","102",..: 1 1 1 1 1 1 1 1 1 1 ...
$ alti : num  1.61 1.6 1.6 1.6 1.6 1.59 1.59 1.59 1.59 1.58 ...
$ year : Factor w/ 6 levels "1979","1983",..: 1 1 1 1 1 1 1 1 1 1 ...

head(dt)
cros along alti year
-205   100 1.61 1979
-200   100 1.60 1979
-195   100 1.60 1979
-190   100 1.60 1979
-185   100 1.60 1979
-180   100 1.59 1979

这个数据是来自不同断面是可变沿,比他们在每5米其是变量测量的断面CROS高度是可变ALTI信息。 这他们已在多个年完成,但有时断面较长,在特定的一年。 所以我想与且未测量所有年份的CRO公司分删除行。

对于我的数据集我有一个因素( along )与113个水平这个因素中我有因素year有6个级别。 在这些以价值观我有X( along )和y( alti我想为X具有相同价值观的几年做分析过去一年不过)。 我想为因素cros ,除去那些不为所有发生的值years的每个因素along

我使用的代码是:

require(data.table)
dt <- as.data.table(total)
tt <- dt[,length(unique(along,year)),by=cros]
tt <- tt[V1==max(V1)]
test <-dt[cros %in% tt$cros]

但是,我没有得到正确的结果。 我可以形象的独特(沿,年)是不是与分组数据工作的正确途径。 但是我不知道怎么做是正确的。

奥凯这里是多一点点清楚我想要什么

> df <- data.frame(along =       c(10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12), year = c(20,20,20,25,25,25,21,21,20,20,25,25,25,21,21,21,20,20,20,20,25,25,25,25,25,21,21,21,21), cros = c(11,12,13,11,12,13,11,12,11,12,11,12,13,11,12,13,14,15,16,17,14,15,16,17,18,12,13,14,15), value = ceiling(rnorm(29)*10))
> df
   along year cros value
   10    20   11    -3
   10    20   12     5
   10    20   13   -22
   10    25   11    -9
   10    25   12    -3
   10    25   13    -8
   10    21   11    -8
   10    21   12    -8
   11    20   11     7
   11    20   12    -4
   11    25   11    -6
   11    25   12     9
   11    25   13    -5
   11    21   11     6
   11    21   12    17
   11    21   13    -5
   12    20   14   -16
   12    20   15   -17
   12    20   16   -18
   12    20   17    -3
   12    25   14   -18
   12    25   15   -11
   12    25   16    -1
   12    25   17     6
   12    25   18    14
   12    21   12    -3
   12    21   13    19
   12    21   14    16
   12    21   15     7

这是我多么希望它看起来像,这样的CRO(x)中没有为这些年来对于给定的断面发生值将被删除。

   along year cros value
    10    20   11    -3
    10    20   12     5
    10    25   11    -9
    10    25   12    -3
    10    21   11    -8
    10    21   12    -8
    11    20   11     7
    11    20   12    -4
    11    25   11    -6
    11    25   12     9
    11    21   11     6
    11    21   12    17
    12    20   14   -16
    12    20   15   -17
    12    25   14   -18
    12    25   15   -11
    12    21   14    16
    12    21   15     7

Answer 1:

下面是做这件事的一种方式。 找到所有的along,cros要保留,然后将它们合并回条目:

dt = data.table(df)

# find the intersections; run in pieces to see what's going on here
to.keep = dt[, list(list(unique(cros))), by = list(along, year)][,
               list(cros = Reduce(intersect, V1)), by = along]

# set the keys to merge together
setkey(to.keep, along, cros)
setkey(dt, along, cros)

# final result
res = to.keep[dt, nomatch = 0]

# optionally, you can order and rearrange columns
setkey(res, along, year, cros)[, names(dt), with = F]
#    along year cros value
# 1:    10   20   11    11
# 2:    10   20   12     7
# 3:    10   21   11    -4
# 4:    10   21   12     9
# 5:    10   25   11   -16
# 6:    10   25   12     8
# 7:    11   20   11    17
# 8:    11   20   12     1
# 9:    11   21   11     8
#10:    11   21   12   -13
#11:    11   25   11    -7
#12:    11   25   12    17
#13:    12   20   14    12
#14:    12   20   15    -7
#15:    12   21   14     3
#16:    12   21   15     9
#17:    12   25   14     6
#18:    12   25   15    -2


Answer 2:

编辑根据我更新了问题的理解1 - 沿样是编号为2-CRO公司是在给定的断面在所有年份的3-所有断面进行了采样,但在所有年份中四的不是每样各采样点进行采样的采样点问题是,除去那些没有对所有6年采样所有采样点

这里有一个方法,以消除那些行:

require(plyr)
count_var<-ddply(dt, ~along+cros, summarise, count = length(year))
str(count_var)
dt<-merge(dt, count_var, by = c("along", "cros"), all.x = T)
dt_all6<-subset(dt, count==6)

为了使DT与所有年份的所有取样点:

along<-as.factor(rep(1:113, 54))
year<-as.factor(c(rep(1979, 1017), rep(1980, 1017), rep(1981, 1017), rep(1982, 1017), rep(1983, 1017), rep(1984, 1017)))
cros_A<-c(rep(5, 113), rep(10, 113), rep(15, 113), rep(20, 113), rep(25, 113), rep(30, 113), rep(35, 113), rep(40, 113), rep(45, 113))
cros<-as.factor(rep(cros_A, 6))
set.seed(2)
alti<-rnorm(6102, mean = 1.5, sd = 0.5)
dt<-cbind.data.frame(along, year, cros, alti)

现在,去掉一些采样点:

dt<-dt[c(1:100, 106:400, 406:1500, 1506:1600, 1606:2500, 2506:3000, 3006:3500, 3506:4000, 4006:5000, 5006:6102), ]


文章来源: Remove row based on two factor levels