2014-01-10 3 views
1

У меня была проблема, которая очень похожа на этот question, однако мои данные сгруппированы на два уровня.Удалить строку на основе двух уровней факторов

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 высоты, которая является переменной алты. Это они делали в течение нескольких лет, однако иногда разрез был более продолжительным в конкретный год. Поэтому я хочу удалить строки с помощью кросс-точек, которые не измерялись все годы.

Для моего набора данных у меня есть один фактор (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 

И это, как я хочу, чтобы выглядеть, так что КИО (х) значения, которые не происходят в течение всех лет для удаляют трансект.

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 
+0

Вы должны привести воспроизводимый пример, используя некоторые данные о игрушке. например сделайте что-то, что описывает проблему, и покажите нам, что вы ожидаете. Что-то похожее на 'data.table (вдоль = as.factor (rep (1: 2, each = 6)), years = rep (2000: 2003, times = 4))' –

ответ

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 
0

Edited на основе моего обновленного понимания проблемы 1-а является трансект ID 2-Кро является точкой отбора проб на данный разрезе 3- всех Разрезов были отобранными во всех годах, но не во всех точках отбора проб на каждый трансект отбирался в течение всех лет 4-проблема заключается в удалении всех точек выборки, которые не были отобраны для всех шести лет

Вот способ, чтобы удалить эти строки:

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) 

Для дТ всех точек выборки от всех лет:

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), ] 
+0

Это не работает, последняя строка кода просто дает мне пустой фрейм данных. Я хочу удалить определенные строки моих переменных cros, которые не появляются каждый год, и это для каждого разреза. – Marinka

+0

Однако у моего образца набора данных были некоторые ошибки в них (я забыл удалить строку номера строки и как-то год и после того, как я развернулся) – Marinka

+0

Является ли cros фактической наблюдательной переменной? или это просто задание, которое вы указали, чтобы указать, присутствуют ли все годы для данного уровня? Я принял последний. Если это неверно, переименуйте переменную длины. – SamanthaDS

Смежные вопросы